C# 使用不带参数的catch

C# 使用不带参数的catch,c#,try-catch,C#,Try Catch,以下两者之间的区别是什么: catch { MessageBox.Show("Error."); } 以及: 在第二个示例中,您可以引用异常数据,如堆栈跟踪、源等。它还提供了一条通常有用的消息。它会告诉您为什么在调试时遇到了一个非常重要的异常。从.NET 2开始,如果您不调整配置?没什么 在此之前,或者通过一些我记不清的配置调整,有可能从未转换为异常兼容对象的非托管代码中引发异常 请注意,在这两者之间还有另一个选项,您可以指定类型,但不指定变量: catch (Exception) {

以下两者之间的区别是什么:

catch
{
    MessageBox.Show("Error.");
}
以及:


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

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


在此之前,或者通过一些我记不清的配置调整,有可能从未转换为异常兼容对象的非托管代码中引发异常

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

catch (Exception)
{
   ...
}

就我个人而言,我会非常小心捕捉到一个异常,甚至不记录它。如果您调用的是boneheaded API,则可能需要它,但通常最好避免使用它。

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

但是,如果你像你一样去捕捉一般异常,我会说使用第二种情况:

catch (Exception ex)
{
     MessageBox.Show("Error.");
     //we never use ex, so is it better to use catch without arguments?
}
这可以帮助您消除错误,因为变量包含堆栈跟踪、异常消息等。您可以使用它来记录错误或帮助您防止错误的东西

但是,要非常小心地使用这种方法:

MessageBox.Show("Error.");

不跟踪你的错误,比如日志文件,可能会造成非常大的混乱。

我认为它们是一样的。但是第二个案例引发了编译器警告,因为您声明了一个未使用的异常。我比较喜欢第一个,因为您明确地说您不使用异常。还有第三个

catch (Exception)
{
    //do something
}
如果要指定异常类型,但不关心异常本身。

某些异常无法捕获异常捕获

下面是linux上mono中的例外情况,应捕获而不带参数

否则,运行时将忽略catchException语句

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
如果遇到这样的问题,请尝试删除catch语句的参数,记录上下文变量以找出错误原因


另外,我不知道如何在windows上运行,在windows上运行的程序是正常的。

我想你没有抓住要点,第一个捕获所有异常,第二个捕获.NET异常。实际上他们问的只是两个捕获示例之间的区别,这就是区别。要么引用异常,要么不引用。您知道,这两个示例都包含所有.Net异常。您捕获的任何异常都将是.Net异常,因为这是C。还需要注意的是,所有异常都在其继承树中具有exception类,因为异常类必须直接或间接地从继承了exception类的另一个类继承。您错了,有些异常不会从异常继承。由用户代码或C代码创建的代码可以,但其他一些代码不能。我真的不喜欢被卷入到你的拖拽中,但我明白,为了抛出异常,你必须从异常继承。所以我尝试了你所说的,创建了一个类,然后尝试抛出一个新的实例。它导致此消息出现异常捕获或抛出的类型必须派生自System.exception。你所说的C代码到底是什么意思,而其他一些代码却不是。考虑到您的声誉,我真的很震惊您竟然不知道琐碎的异常处理/行为。jlafay-再一次,您错了。某些非托管代码(即not C和not.NET)抛出的异常不是从异常派生的。为什么您会认为我在跟踪呢?在第二种情况下,如果您想捕获该类型或派生类型的异常,但不想知道详细信息,请使用catch Exception。否则,您将得到一个警告,并在不需要时声明一个变量异常数据仍然是可访问的。如果您在没有变量的情况下进入异常,将显示一个符号,该符号将显示异常数据。@GeirGrusom-是的,但您不能将该信息用于登录文件或其他内容,对吗?@GeirGrusom当然,您可以在调试时看到异常,但是,在记录日志或向用户显示适当的消息时,您没有对它的引用。有可能从未获取的非托管代码中引发异常。。。因此,从2.0开始,它将转换为异常兼容?i、 现在托管或非托管抛出的任何内容也将被catch异常e{}捕获。顺便说一句,我确实尝试过Outlook互操作库,但不确定如何获得合法的非托管代码错误。@devanalyst:是的,我相信现在所有内容都转换为异常。@JonSkeet:但是catch、catch Exception和catch Exception ex之间的区别是什么?第一个只是捕捉所有东西,第二个只是类型,第三个也是细节?除了异常之外,您应该捕获什么?@testing:您通常会捕获特定的异常类型。根据答案,在.NET2.0之前,有一些奇怪的情况,catchExc
eption{}可能不会捕获所有内容,但catch{}会捕获所有内容,IIRC。但幸运的是,那些日子早已过去。这是否意味着,如果抛出异常,即使我们不处理异常,它仍然会进入catch块内部?@PedroGordo是的
System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.