6

您对如下所示的代码有何看法:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        throw;
    }
}

我看到的问题是没有处理实际错误,只是将异常抛出到不同的地方。我发现调试起来更加困难,因为我没有得到实际问题所在的行号。

所以我的问题是为什么这会很好?

- - 编辑 - -

从答案看来,大多数人都说在没有捕获自定义或特定异常的情况下这样做是没有意义的。这就是我想要评论的内容,当没有捕获到特定异常时。我可以看到实际使用捕获的异常做某事的意义,而不是这段代码的方式。

4

10 回答 10

16

根据您所查看的质量,它不会在不同的地方引发异常。没有目标的“抛出”会重新抛出异常,这与抛出异常非常不同。主要是重新抛出不会重置堆栈跟踪。

在这个特定的示例中,catch 毫无意义,因为它什么都不做。异常被愉快地重新抛出,就好像 try/catch 不存在一样。

于 2009-04-15T13:45:01.933 回答
3

我认为该构造应该用于处理您知道将在代码中抛出的异常;如果引发其他异常,则重新抛出。

考虑到投掷;与 throw ex 不同;

throw ex 会将堆栈截断到新的抛出点,丢失有关异常的有价值信息。

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (EspecificException ex)
    {
        HandleException(ex);
    }
    catch (Exception ex)
    {
        throw;
    }
}
于 2009-04-15T13:45:17.767 回答
3

它不会,理想情况下,catch 块会做一些处理,然后重新抛出,例如,

try
{
    //do something
}
catch (Exception ex)
{
    DoSomething(ex); //handle the exception
    throw;
}

当然,如果您想在代码的上层进行一些进一步的处理,重新抛出将很有用。

于 2009-04-15T13:48:44.450 回答
1

做这样的事情是相当没有意义的,总的来说,我尽量不走上做无意义的事情的道路;)

在大多数情况下,我相信捕获您知道如何处理的特定类型的异常,即使这仅意味着使用更多信息创建您自己的异常并将捕获的异常用作 InnerException。

于 2009-04-15T13:46:52.067 回答
1

有时这是合适的——当您要处理调用堆栈中更高的异常时。但是,您需要在该 catch 块中做一些事情,而不仅仅是重新抛出以使其有意义,例如记录错误:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        LogException (ex);  // Log error...
        throw;
    }
}
于 2009-04-15T13:48:55.683 回答
1

我不认为仅仅重新抛出错误会有用。除非您一开始并不真正关心错误。

我认为实际上做一些事情会更好。

您可以查看MSDN 异常处理指南

于 2009-04-15T13:53:02.863 回答
0

我见过像这样捕获通用异常然后将其重新打包到自定义异常对象中的实例。

这与您所说的不同之处在于,这些自定义 Exception 对象包含有关发生的实际异常的更多信息,而不是更少。

于 2009-04-15T13:44:09.673 回答
0

对于初学者来说,我只是这样做

catch
{
   throw;
}

但基本上,如果您要捕获多种类型的异常,您可能希望在本地处理一些异常,而另一些则备份堆栈。

例如

catch(SQLException sex) //haha
{
   DoStuff(sex);
}
catch
{
   throw;
}
于 2009-04-15T13:46:27.420 回答
0

取决于你所说的“看起来像这样”是什么意思,如果在 catch 块中除了重新抛出之外没有别的东西......如果是这种情况,try catch 是没有意义的,除非,正如你所说,混淆异常发生的位置. 但是,如果您需要在发生错误的地方做某事,但希望在堆栈中进一步处理异常,这可能是合适的。但是,捕获将针对您正在处理的特定异常,而不是针对任何异常

于 2009-04-15T13:47:28.183 回答
0

通常拥有不做任何事情的异常处理块根本不好,原因很简单,它会阻止 .Net 虚拟机在性能优化代码时内联您的方法。

For a full article on why see "Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks" by Scott Hanselman

于 2009-04-15T14:45:40.990 回答