C# C中的Catch和Catch(异常e)#

C# C中的Catch和Catch(异常e)#,c#,.net,C#,.net,我想这三部分代码之间没有区别,不是吗 try { // ............. } catch { // ............. } 及 及 然而,我几乎知道什么时候应该使用第一个和什么时候-第二个。但我想让你谈谈你的想法。视情况而定。我不知道前两个有什么区别 如果要在catch块中使用异常,即获取堆栈跟踪或其他信息,则必须使用最后一个异常,以便有一个要引用的对象 如果您只是抛出异常供其他人处理,则不需要它。

我想这三部分代码之间没有区别,不是吗

   try
    {
       // .............
    }
    catch
    {
        // ............. 
    }


然而,我几乎知道什么时候应该使用第一个和什么时候-第二个。但我想让你谈谈你的想法。

视情况而定。我不知道前两个有什么区别

如果要在catch块中使用异常,即获取堆栈跟踪或其他信息,则必须使用最后一个异常,以便有一个要引用的对象


如果您只是抛出异常供其他人处理,则不需要它。

第一个异常也将捕获抛出的非异常对象。
()

如果您没有实际使用exception变量,那么第二个将不会给出编译器警告

只有当您确实需要检查抛出的异常(例如,记录它)时,才应该使用第三个异常。

这些代码位有很大的不同

第一种方法不允许您从发生的异常中获取任何信息。它会捕捉到任何东西,但你不会知道捕捉到了什么

第二种方法不允许您执行任何操作,但至少允许您指定什么样的异常。在您的示例中,由于您已经指示了
异常
,它将捕获从
异常
派生的所有内容。但是它可以被改变来微调被捕获的东西——但仍然允许你对它什么也不做


第三种情况允许您实际访问异常并从中获取信息。

第三种情况实际上是:

当try块中的某一行发生异常时,将创建相应异常的对象。包含
(异常e)
的catch块实际上有一个
异常
类变量
e
作为其参数。然后将异常对象的引用复制到此引用变量。现在,您可以根据需要使用此e变量来标识引发的异常类型,例如
e。message()
提供了与异常相关的描述


第一种和第二种情况已经用Slaks很好地解释了

什么是“任何东西”?@AlexMaslakov我的意思是,字面上的任何东西。这就是为什么我用这个词。如果一些不符合cls的代码设法抛出非异常,它甚至会捕获非异常。从.NET 2.0开始,第一个和第二个示例是相同的。非CLS兼容的异常现在由RuntimeWrappedException包装,它派生自Exception。
   try
    {
       // .............
    }
    catch(Exception)
    {
       // .............  
    }
try
{
   // .............
}
catch(Exception e)
{
    // ............. 
}