【问题标题】:Thoughts on try-catch blocks关于 try-catch 块的思考
【发布时间】:2010-10-19 14:25:02
【问题描述】:

你对这样的代码有什么看法:

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

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

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

---- 编辑----

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

【问题讨论】:

    标签: c# exception-handling coding-style try-catch


    【解决方案1】:

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

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

    【讨论】:

    • 我以前见过这样的代码。通常它是在调试期间插入的,因此有人可以在“throw”上放置一个断点。
    • @Joel,明白了。更好的解决方案可能是使用 VS 打破投掷。但它的粒度并不像它可能的那样细:(
    • 与断点相比的优势在于,您可以在单元测试期间记录非关键错误的详细信息,这通常非常有用!
    • @Jon 同意了。但是在这个例子中,代码只是简单地重新抛出并且什么都不做。
    【解决方案2】:

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

    考虑到 扔; 不同于 扔前;

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

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

    【讨论】:

    • 在您的示例中,catch (Exception ex) 不是必需的。简单地不处理异常也会有同样的效果。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

          您可以查看MSDN Exception Handling Guide。

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              catch
              {
                 throw;
              }
              

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

              例如

              catch(SQLException sex) //haha
              {
                 DoStuff(sex);
              }
              catch
              {
                 throw;
              }
              

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

                  有关为什么请参阅Scott Hanselman 的“Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks”的完整文章

                  【讨论】:

                    猜你喜欢
                    • 2012-04-25
                    • 2011-09-10
                    • 2016-03-15
                    • 2016-05-08
                    • 1970-01-01
                    • 2016-05-21
                    • 1970-01-01
                    • 2020-04-02
                    • 2016-04-26
                    相关资源
                    最近更新 更多