使用catch没有参数

有什么区别:

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开始,如果你不调整configuration​​? 没有。

在此之前,或者对一些configuration的调整,我不记得确切地说,有可能从非托pipe代码抛出的exception, 没有被转换成一个Exception兼容的对象。

请注意,还有另一个选项,您可以指定types但不指定variables:

 catch (Exception) { ... } 

就我个人而言,即使没有logging ,也会非常警惕地捕捉exception。 如果你打电话给一个骨头的API可能是必需的,但通常最好避免它。

我认为他们是一样的。 但第二种情况提出了编译器警告,因为你声明了一个你没有使用的exception。 我很喜欢第一个,因为你明确地说,你不使用这个exception。 还有第三个

 catch (Exception) { //do something } 

如果你想指定exception的types,但不关心exception本身。

一般来说,你应该首先发现特定的错

但是,如果你像捕捉一般的Exception ,我会说使用第二种情况:

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

这可以帮助你debbuging,因为variables包含堆栈跟踪,exception消息…等。 你可以用它来logging错误或者帮助你预防错误。

不过要非常小心,使用这种方法:

 MessageBox.Show("Error."); 

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

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

一些exception不能catch(Exception)

在linux下的mono下面,应该没有参数。

否则,运行时将忽略catch(Exception)语句。

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

如果遇到这样的问题,请尝试删除catch语句的参数,logging上下文variables以找出错误原因。

PS我不知道如何在Windows上,在Windows中运行的程序是正常的。