抛出或不抛出C#中的异常

时间:2012-01-30 18:16:54

标签: c# try-catch throw

  

可能重复:
  Why catch and rethrow Exception in C#?

我一直在努力寻找这个问题的答案 - 两者之间有什么关系?

try
{
    //Do Something
}
catch
{
    throw;
}

VS

try
{
    //Do Something
}
catch
{
}

try
{
    //Do Something
}
catch (Exception Ex)
{
    //Do something with Exception Ex
}

6 个答案:

答案 0 :(得分:5)

堆栈中的第一个rethrows异常并保留堆栈跟踪。

第二个吞下(隐藏)异常。

第三个也可能吞下异常但它取决于(//做某事)的作用。

答案 1 :(得分:4)

catch - > throw实际上只会抛出你的错误,所以你必须在其他地方捕获它。如果您想先捕获一些内容然后将错误抛给上面的其他方法,这可能很有用。

示例:

try
{
    // do something
}
catch
{
    Console.WriteLine("Something went wrong, and you'll know it");
    throw;
}

// won't get here anymore, the exception was thrown.

尝试 - > catch会让你忽略错误。

try
{
    // do something
}
catch
{
    Console.WriteLine("Something went wrong, and you won't know it.");
}

// continuing happily

答案 2 :(得分:2)

第一个重新抛出相同的异常。第二个吞下异常就像它从未发生过一样。所以这取决于你需要什么。

请注意 IS 这两者之间存在差异:

try
{
    //Do Something
}
catch (Exception Ex)
{
    //re-throws the same exception that was caught
    throw;
}

try
{
    //Do Something
}
catch (Exception Ex)
{
    //throws a _new_ exception containing Ex
    throw Ex;
}

答案 3 :(得分:1)

首先,你只是重新抛出异常。在这种情况下,您不需要try / catch,因为您没有对捕获的异常做任何事情。

在第二种情况下,你吞下所有例外情况。这非常危险。不要这样做。它永远不会是正确的。

最后,你还没有给我们足够的细节知道。您正在捕获异常,并且可能会对其执行某些操作。你可以重新抛出,你可以吞下去。你还没有告诉我们。

答案 4 :(得分:1)

在第一个块中,第一个块的处理程序内部再次抛出异常。这意味着它可以被外部try / catch范围块拾取。第二个块“占用”catch块中的异常,并且在执行catch块中的代码后,程序执行可以正常继续。

答案 5 :(得分:1)

在第一种情况下,异常被重新抛出给调用者。这个版本没有意义,因为你没有对异常做任何事情,但实际上你可以做一些事情,然后将异常抛给调用者。在过滤异常时(例如

),它也很有用
try
{
   //do somethign
}
catch(Exception1)
{
    throw;
}
catch
{
   //do something
}

第二个是你永远不应该做的事情。您正在覆盖异常,并且更难以捕获应用程序中的最终错误。您需要以有意义的方式处理异常或让它破坏程序(或让调用者处理它)

第三个例子是简单的异常处理。确保不要将其用作if / else(流控制)

的形式