【问题标题】:Catch and Catch(Exception e) in C#C# 中的 Catch 和 Catch(异常 e)
【发布时间】:2012-09-09 06:13:17
【问题描述】:

我猜这三部分代码没有区别吧?

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

   try
    {
       // .............
    }
    catch(Exception)
    {
       // .............  
    }

try
{
   // .............
}
catch(Exception e)
{
    // ............. 
}

但是,我几乎很清楚什么时候应该使用第一个,什么时候应该使用第二个。但我希望你能说出你的想法。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    第一个也将捕获不是异常的抛出对象。
    (this can happen from non-CLS-compliant code)

    如果您实际上不使用异常变量,第二个不会给出编译器警告。

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

    【讨论】:

    • 从 .NET 2.0 开始,第一个和第二个示例是相同的。不符合 CLS 的异常现在由派生自 Exception 的 RuntimeWrappedException 包装。
    【解决方案2】:

    这些代码相当有点不同。

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

    第二个不允许你做任何事情,但至少可以让你指定什么样的异常。在您的示例中,由于您指定了Exception,它将捕获从Exception 派生的所有内容。但可以对其进行更改以微调捕获的内容 - 但仍然允许您对它不做任何事情。

    第三个让您实际访问异常并从中获取信息。

    【讨论】:

    • >“任何东西”是什么意思?
    • @AlexMaslakov 我的意思是,从字面上看,任何东西。这就是我使用这个词的原因。如果一些不符合 cls 的代码设法抛出非异常,它甚至会捕获非异常。
    【解决方案3】:

    第三种情况其实是这样的:

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

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

    【讨论】:

      【解决方案4】:

      这取决于。我不知道前两者之间的区别。

      如果你想在 catch 块中使用异常,即获取堆栈跟踪或其他信息,你必须使用最后一个,这样你就有一个对象可以引用。

      如果你只是抛出异常让别人处理,你就不需要它。

      【讨论】:

        猜你喜欢
        • 2020-07-26
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 2013-06-09
        • 2010-12-14
        • 2012-05-04
        • 1970-01-01
        相关资源
        最近更新 更多