Catch vs Catch(例外e)和Throw vs Throw e

时间:2012-05-29 20:11:10

标签: c# try-catch

这两个代码示例是否相同? Catch Catch(例外e)具有相同的输出,如果我写投掷投掷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;
    }
}

2 个答案:

答案 0 :(得分:52)

我认为这里有两个问题。


throwthrow e;有什么区别?

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


catchcatch (Exception e)有什么区别?

你的两个例子都是一样的,同样没用 - 它们只是捕获异常然后重新抛出它。一个小的区别是第一个示例将生成编译器警告。

  

变量'e'已声明但从未使用过

如果你在catch块中有一些实际上有用的代码,那么问这个问题更有意义。例如,您可能希望记录异常:

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

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

如果你的catch块实际上没有使用异常,那么你会想要使用第二个版本来避免编译器警告。

答案 1 :(得分:35)

如果我们忽略“未使用的变量”警告,那么

之间只有实用的区别
catch {...}

catch(Exception ex) {...}

是一些非C#代码抛出非Exception异常的时候。 C ++可以抛出 任何 。在.NET 1.1中,您 使用catch(无(Exception ex))来处理这些异常异常。然而,这是有问题的 - 尤其是,你无法看到抛出的东西!因此,在.NET 2.0及更高版本中,这是默认包装的,因此即使C ++抛出一个string - 您也将其视为Exception子类。请注意,可以通过配置设置禁用此功能,但是:请勿执行此操作。别管它了!

已经提到了throw; vs throw ex;的问题,它与堆栈跟踪有关。在这两种情况下都可以使用throw,从而保留原始堆栈跟踪。