要捕捉的参数?

时间:2012-05-14 07:01:49

标签: c# try-catch

是否可以将参数传递给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); 
}

我该怎么做?

4 个答案:

答案 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));