有什么区别:
catch
{
MessageBox.Show("Error.");
}
和
catch (Exception ex)
{
MessageBox.Show("Error.");
//we never use ex, so is it better to use catch without arguments?
}
答案 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中的程序是正常的。