有什么区别:
catch
{
MessageBox.Show("Error.");
}
和:
catch (Exception ex)
{
MessageBox.Show("Error.");
//we never use ex, so is it better to use catch without arguments?
}
从 .NET 2 开始,如果不调整配置怎么办?没什么。
在那之前,或者通过一些我记不清的配置调整,有可能从非托管代码中抛出异常,而该异常没有被转换为
Exception
兼容的对象。
请注意,中间还有另一个选项,您可以在其中指定类型但不指定变量:
catch (Exception)
{
...
}
就我个人而言,我会非常警惕在没有记录的情况下捕获异常。如果您调用的是愚蠢的 API,则可能需要这样做,但通常最好避免这样做。
我认为它们是相同的,但第二种情况会引发编译器警告,因为您声明了一个未使用的异常。我更喜欢第一个,因为你明确表示你不使用异常。
如果你想指定异常类型但不关心异常本身,还有第三种:
catch (Exception)
{
//do something
}
一般来说,您应该首先捕获特定的错误。
但是如果你像你一样去抓将军
Exception
我会说使用第二种情况:
catch (Exception ex)
{
MessageBox.Show("Error.");
//we never use ex, so is it better to use catch without arguments?
}
这可以帮助您进行调试,因为变量包含堆栈跟踪、异常消息等。您可以使用它来记录错误或帮助您防止错误的东西。
使用这种方法时要非常小心:
MessageBox.Show("Error.");
不跟踪某个地方的错误(例如日志文件)可能会导致非常大的混乱。
在第二个示例中,您可以引用异常数据,例如堆栈跟踪、源等。它还提供了有时有用的一般消息。它告诉您为什么会遇到异常,这在调试时很重要。
有些异常无法被
catch(Exception)
捕获。
Linux 上的 Mono 中出现以下异常,应该在不带参数的情况下捕获。
否则运行时将忽略
catch(Exception)
语句。
System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
如果遇到这样的问题,请尝试删除
catch
语句的参数,记录上下文变量以找出错误原因。
附注不知道在windows上如何,在windows下运行的程序是正常的