c# - Catch vs Catch(异常 e)和 Throw vs Throw e

标签 c# try-catch

这两个代码示例是否相同? CatchCatch (Exception e) 的输出是一样的,如果我写 ThrowThrow e 结果也是一样的.

主要:

try
{
    A();
    //B();
}
catch (Exception e)
{
    Console.WriteLine("{0} exception caught.", e);
}

代码 1:

static void A()
{
    try
    {
        int value = 1 / int.Parse("0");
    }
    catch (Exception e)
    {
        throw e;
    }
}

代码 2:

static void A()
{
    // Rethrow syntax.
    try
    {
        int value = 1 / int.Parse("0");
    }
    catch
    {
        throw;
    }
}

最佳答案

我认为这里有两个问题。


throwthrow e; 有什么区别?

我不认为有什么好的理由写catch (Exception e) { throw e; }。这会丢失原始堆栈跟踪。当您使用 throw; 时,原始堆栈跟踪将被保留。这很好,因为这意味着错误的原因更容易找到。


catchcatch (Exception e) 有什么区别?

你的两个例子都是一样的,同样没用——它们只是捕捉到一个异常,然后重新抛出它。一个细微差别是第一个示例将生成编译器警告。

The variable 'e' is declared but never used

如果您的 catch block 中有一些其他代码实际上做了一些有用的事情,那么问这个问题就更有意义了。例如,您可能想要记录异常:

try
{
    int value = 1 / int.Parse("0");
}
catch (Exception e)
{
    LogException(e);
    throw;
}

现在有必要使用第一个版本,以便您可以引用捕获的异常。

如果您的 catch block 实际上没有使用异常,那么您可能希望使用第二个版本来避免编译器警告。

关于c# - Catch vs Catch(异常 e)和 Throw vs Throw e,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10805987/

相关文章:

python - 为什么我的 Python 异常没有被重新引发?

c# - 在没有单独的 try-catch block 的情况下 try catch 每一行代码

java - 无法赋值时,变量可能已经赋值

c# - AutoResetEvent没有正确阻止

c# - 时间复杂度——这两种算法中哪一种更快?

c# - CosmosDB 的 MongoDB api 限制访问

c# - Winforms Treeview 文本被截断

c# - 这两种说法有什么区别?

java - 如何使用 try-catch 异常改进此代码

c# - 我可以有多个 try block 和一个 catch block 吗