Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不带参数的catch_C#_Try Catch - Fatal编程技术网

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中的例外情况,应捕获而不带参数

否则,运行时将忽略捕获(异常)station

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


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

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