使用不带参数的catch

时间:2011-11-04 13:18:26

标签: c# try-catch

有什么区别:

catch
{
    MessageBox.Show("Error.");
}

catch (Exception ex)
{
    MessageBox.Show("Error.");
    //we never use ex, so is it better to use catch without arguments?
}

5 个答案:

答案 0 :(得分:62)

从.NET 2开始,如果你不调整配置​​?什么都没有。

在此之前,或者通过一些配置调整我记不清楚,有可能从非托管代码中抛出异常没有转换为Exception兼容的对象。

请注意,中间还有另一个选项,您可以在其中指定类型但不指定变量:

catch (Exception)
{
   ...
}

我个人非常警惕在没有记录的情况下捕获异常。如果您正在调用一个骨干API,则可能需要它,但通常最好避免使用它。

答案 1 :(得分:7)

我认为他们是一样的。但是第二种情况引发了编译器警告,因为你声明了一个你没有使用的异常。我更喜欢第一个,因为你明确说明你没有使用异常。还有第三个

catch (Exception)
{
    //do something
}

如果要指定异常类型但不关心异常本身。

答案 2 :(得分:6)

通常,您应该首先捕获特定错误。

但是,如果你像我一样去追捕将军Exception,我会说第二种情况:

catch (Exception ex)
{
     MessageBox.Show("Error.");
     //we never use ex, so is it better to use catch without arguments?
}

这可以帮助你进行debbuging,因为变量包含堆栈跟踪,异常消息......等。您可以使用它来记录错误或有助于您防止错误的内容。

尽管如此,请小心使用这种方法:

MessageBox.Show("Error.");

不在某处(如日志文件)跟踪您的错误可能会导致非常混乱。

答案 3 :(得分:3)

在第二个示例中,您可以引用异常数据,例如堆栈跟踪,源代码等。它还提供有时有用的常规消息。它告诉你为什么你遇到了一个在调试时很重要的异常。

答案 4 :(得分:0)

某些例外不能被catch(Exception)抓住。

在Linux上的mono中,不应该没有参数。

否则运行时将忽略catch(Exception)声明。

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.

如果您遇到类似的问题,请尝试删除catch语句的参数,记录上下文变量以找出错误原因。

P.S。我不知道如何在Windows上运行Windows中的程序是正常的。