是否可以将参数传递给catch块? 以下是一些示例代码:
try
{
myTextBox.Text = "Imagine, that could fail";
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
如果失败,我现在可以将文本框( myTextBox )传递给我的catch块吗?不便。那样:
try
{
myTextBox.Text = "Imagine, that could fail";
}
catch (Exception e, TextBox textBox)
{
textBox.BorderBrush = Colors.Red;
MessageBox.Show(e.Message);
}
我该怎么做?
答案 0 :(得分:6)
不可能通过标准来实现。
您可以做的是定义您的自定义异常并在那里分配参数,例如:
public class MyCustomException : Exception
{
public string SomeAdditionalText {get;set;}
....
//any other properties
...
}
并且在引发异常的方法内部引发了您自己的MyCustomException
答案 1 :(得分:6)
您只有catch
一件事,在C#中必须是Exception
。所以不是直接的。然而!如果Exception
是自定义SomethingSpecificException
,那么您可以在e.SomeProperty
上提供该信息。
public class SomethingSpecificException : Exception {
public Control SomeProperty {get;private set;}
public SomethingSpecificException(string message, Control control)
: base(message)
{
SomeProperty = control;
}
...
}
然后在某些时候你可以:
throw new SomethingSpecificException("things went ill", ctrl);
和
catch(SomethingSpecificException ex) {
var ctrl = ex.SomeProperty;
....
}
答案 2 :(得分:1)
不知道你想要实现什么,但是在catch块中你可以访问任何UI元素,就像在try块中一样。所以对我来说,没有必要在catch块中定义一个额外的参数。
答案 3 :(得分:0)
接下来可以使用自定义异常来区分正在发生的事情:
try
{
myClass.DoSomethingThatCouldThrow();
myClass.DoSomethingThatThrowsSomethingElse();
myClass.DoAnotherThingWithAThirdExceptionType();
}
catch(FirstSpecialException ex)
{
// Do something if first fails...
}
catch(SecondSpecialException ex)
{
// Do something if second fails...
}
您还可以将每个语句放入其自己的异常块中。这将使您的代码相当长,但如果您不能更改类以抛出任何特殊异常,则可能是唯一的可能性。
try
{
myClass.DoSomethingThatCouldThrow();
}
catch(InvalidOperationException ex)
{
// Do something if it fails...
}
try
{
myClass.DoSomethingThatCouldThrow();
}
catch(InvalidOperationException ex)
{
// Do something if it fails...
}
try
{
myClass.DoAnotherThingWithAThirdExceptionType();
}
catch(InvalidOperationException ex)
{
// Do something if it fails...
}
由于事实,这最后,看起来有点像重复代码,我们可以把它放到一些方法与下面的身体:
public void TryCatch<ExceptionT>(Action tryMethod, Action<ExceptionT> catchMethod)
where ExceptionT : Exception
{
// ToDo: ArgumentChecking!
try
{
tryMethod();
}
catch(ExceptionT ex)
{
catchMethod(ex);
}
}
然后你可以打电话给:
TryCatch<InvalidOperationException>(
() => myClass.DoSomething(),
(ex) => Console.WriteLine(ex.Message));