使用不带参数的catch

问题描述 投票:0回答:5

有什么区别:

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

和:

catch (Exception ex)
{
    MessageBox.Show("Error.");
    //we never use ex, so is it better to use catch without arguments?
}
c# try-catch
5个回答
98
投票

从 .NET 2 开始,如果不调整配置怎么办?没什么。

在那之前,或者通过一些我记不清的配置调整,有可能从非托管代码中抛出异常,而该异常没有被转换为

Exception
兼容的对象。

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

catch (Exception)
{
   ...
}

就我个人而言,我会非常警惕在没有记录的情况下捕获异常。如果您调用的是愚蠢的 API,则可能需要这样做,但通常最好避免这样做。


10
投票

我认为它们是相同的,但第二种情况会引发编译器警告,因为您声明了一个未使用的异常。我更喜欢第一个,因为你明确表示你不使用异常。

如果你想指定异常类型但不关心异常本身,还有第三种:

catch (Exception)
{
    //do something
}

6
投票

一般来说,您应该首先捕获特定的错误。

但是如果你像你一样去抓将军

Exception
我会说使用第二种情况:

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

这可以帮助您进行调试,因为变量包含堆栈跟踪、异常消息等。您可以使用它来记录错误或帮助您防止错误的东西。

使用这种方法时要非常小心:

MessageBox.Show("Error.");

不跟踪某个地方的错误(例如日志文件)可能会导致非常大的混乱。


3
投票

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


0
投票

有些异常无法被

catch(Exception)
捕获。

Linux 上的 Mono 中出现以下异常,应该在不带参数的情况下捕获。

否则运行时将忽略

catch(Exception)
语句。

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

如果遇到这样的问题,请尝试删除

catch
语句的参数,记录上下文变量以找出错误原因。

附注不知道在windows上如何,在windows下运行的程序是正常的

© www.soinside.com 2019 - 2024. All rights reserved.