代码之家  ›  专栏  ›  技术社区  ›  John Boker

关于试抓块的思考

  •  6
  • John Boker  · 技术社区  · 15 年前

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

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

    我看到的问题是实际的错误没有被处理,只是把异常扔到了另一个地方。我发现调试更困难,因为我没有得到实际问题所在的行号。

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

    ------编辑

    从答案来看,似乎大多数人都说这样做毫无意义,没有任何自定义或特定的异常被捕获。这就是我想要的评论,当没有特别的例外被发现的时候。我可以看到在捕获到异常的情况下实际执行某些操作的要点,而不是这种代码的方式。

    10 回复  |  直到 14 年前
        1
  •  15
  •   JaredPar    15 年前

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

    在这个特定的示例中,catch是无意义的,因为它不做任何事情。异常情况很高兴地重新发生了,几乎就像try/catch不存在一样。

        2
  •  3
  •   Jhonny D. Cano -Leftware-    15 年前

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

    考虑到这一点 投掷; 不同于 抛出;

    throw-ex会将堆栈截断到新的抛出点,从而丢失有关异常的宝贵信息。

    public void doSomething()
    {
        try
        {
           // actual code goes here
        }
        catch (EspecificException ex)
        {
            HandleException(ex);
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    
        3
  •  3
  •   Jon Limjap    15 年前

    不可能,理想情况下,catch块会做一些处理,然后重新执行,例如,

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

    当然,如果您想在代码的上层做一些进一步的处理,那么重新抛出将非常有用。

        4
  •  1
  •   Adam Robinson    15 年前

    做这样的事是毫无意义的,总的来说,我尽量不走无意义的路。

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

        5
  •  1
  •   Joe Albahari    15 年前

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

    public void doSomething()
    {
        try
        {
           // actual code goes here
        }
        catch (Exception ex)
        {
            LogException (ex);  // Log error...
            throw;
        }
    }
    
        6
  •  0
  •   Justin Niessner    15 年前

    我见过这样捕获泛型异常,然后重新打包到自定义异常对象中的实例。

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

        7
  •  0
  •   Eoin Campbell    15 年前

    好吧,首先我会这么做

    catch
    {
       throw;
    }
    

    但基本上,如果您捕获了多种类型的异常,您可能需要在本地处理一些异常,而在堆栈中备份其他异常。

    例如

    catch(SQLException sex) //haha
    {
       DoStuff(sex);
    }
    catch
    {
       throw;
    }
    
        8
  •  0
  •   Charles Bretana    15 年前

    取决于你所说的“看起来像这样”,如果在catch块中除了一个rethrow之外没有其他内容…如果是这种情况,则try catch是无意义的,除非,如您所说,混淆异常发生的位置。但是,如果您需要在发生错误的地方做一些事情,但是希望进一步处理堆栈中的异常,那么这可能是适当的。但接下来,捕获的将是您所处理的特定异常,而不是任何异常。

        9
  •  0
  •   aintnoprophet    15 年前

    我不认为仅仅重述这个错误是有用的。除非你一开始真的不在乎这个错误。

    我认为在捕捉过程中做些实际的事情会更好。

    你可以查一下 MSDN Exception Handling Guide .

        10
  •  0
  •   Martin Brown    15 年前

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

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