使用不带参数的catch

pet*_*ski 53 c# try-catch

有什么区别:

catch
{
    MessageBox.Show("Error.");
}
Run Code Online (Sandbox Code Playgroud)

和:

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

Jon*_*eet 67

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

在此之前,或者通过一些配置调整我无法准确记住,有可能从非托管代码抛出异常,但未转换为Exception兼容对象.

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

catch (Exception)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • @测试:您通常会捕获*特定*异常类型。按照答案,在.NET 2.0之前,有一些奇怪的情况,即`catch(Exception){}`可能无法捕获所有内容,而`catch {}`会覆盖IIRC。但是幸运的是,那些日子早已一去不复返了。 (2认同)

小智 8

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

catch (Exception)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

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


The*_*yan 6

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

但是,如果你去寻找Exception像你一样的将军,我会说使用第二种情况:

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

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

但是要小心使用这种方法:

MessageBox.Show("Error.");
Run Code Online (Sandbox Code Playgroud)

不跟踪某处的错误(如日志文件)可能会造成非常大的混乱.