关于Try-Catch:在C#中引发或不引发异常

To throw or not to throw an exception in C#

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why catch and rethrow Exception in C#?

我一直在搜索网络,试图找到这个问题的答案——这两者之间是什么?

1
2
3
4
5
6
7
8
try
{
    //Do Something
}
catch
{
    throw;
}

VS

1
2
3
4
5
6
7
try
{
    //Do Something
}
catch
{
}

1
2
3
4
5
6
7
8
try
{
    //Do Something
}
catch (Exception Ex)
{
    //Do something with Exception Ex
}


第一个将异常向上推送到堆栈并保留堆栈跟踪。

第二个吞下(隐藏)例外。

第三个可能也会接受这个例外,但这取决于(//做些什么)做了什么。


catch->throw实际上只会抛出错误,因此您必须在其他地方捕获它。如果您想先捕获某个内容,然后将错误抛出到上面的其他方法中,那么这将非常有用。

例子:

1
2
3
4
5
6
7
8
9
10
11
try
{
    // do something
}
catch
{
    Console.WriteLine("Something went wrong, and you'll know it");
    throw;
}

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

而try->catch只允许您忽略错误。

1
2
3
4
5
6
7
8
9
10
try
{
    // do something
}
catch
{
    Console.WriteLine("Something went wrong, and you won't know it.");
}

// continuing happily


第一个则重新抛出捕获的异常。第二个则像从未发生过一样吞下了例外。所以这取决于你需要什么。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}


在第一种情况下,异常会重新引发到调用方。这个版本是没有意义的,因为您对异常不做任何事情,但是在实践中,您可能会做一些事情,然后将异常抛出给调用者。它在过滤异常时也很有用,例如

1
2
3
4
5
6
7
8
9
10
11
12
try
{
   //do somethign
}
catch(Exception1)
{
    throw;
}
catch
{
   //do something
}

第二件事是你不应该做的。您正在覆盖一个异常,这使得在应用程序中捕捉最终的错误变得更加困难。您要么需要以有意义的方式处理异常,要么让它破坏程序(或者让调用者处理它)。

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


在第一个块中,在第一个块的处理程序内再次引发异常。这意味着它可以被外部的Try/Catch作用域块拾取。第二个块"吃"catch块中的异常,执行catch块中的代码后,程序执行可以正常继续。


首先,您只是在重新引发异常。在这种情况下,您不需要Try/Catch,因为您不需要对捕获的异常执行任何操作。

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

最后,你没有给我们足够的细节让我们知道。您正在捕获异常,您可能会对此做些什么。你可以再流,你可以吞咽。你还没告诉我们。