Exception handling 多个尝试捕捉还是一个?

Exception handling 多个尝试捕捉还是一个?,exception-handling,Exception Handling,通常,我会这样做: try { code code that might throw an anticipated exception you want to handle code code that might throw an anticipated exception you want to handle code } catch { } 这样做有什么好处吗 code try { code that might throw

通常,我会这样做:

try
{
    code

    code that might throw an anticipated exception you want to handle

    code

    code that might throw an anticipated exception you want to handle

    code
}
catch 
{

}
这样做有什么好处吗

code

try
{
    code that might throw an anticipated exception you want to handle
}
catch
{
}

code

try
{
    code that might throw an anticipated exception you want to handle
}
catch
{
}

code
更新:


我最初问这个问题时引用了C#,但正如A.Levy所评论的,它可以应用于任何异常处理语言,所以我让标记反映了这一点。

我认为第二种方法更好,因为它允许您更准确地捕获错误。

另外,如果你的应用程序出现了某种问题并且崩溃了,那么将你的整个代码包装在一个大的try/catch块中是不好的,但是由于你捕获了一个大的通用执行选项,你能够正确处理它的机会就低了。
您应该在try-catch中包含spesfic部分,比如读取文件或接受用户输入。通过这种方式,您可以更好地处理该异常,但理想情况下使用代码保护-如果捕获到异常,try/catch可能代价高昂。

两者都不是,只需对特定异常使用多个catch块即可(除非块中只有一吨代码,并且只有几行可能抛出异常。在这种情况下,我将使用第二种方法).

如果我可以选择第二种方法,我可能会将其分为两个函数。

我更喜欢第二种方法-它可以使调试更容易,错误处理更准确,也可以很好地输入到单元测试中。

第二种方法。将可能引发异常的代码与其他代码分开-保留该部分更小、更易于管理,而不是包装所有代码,即使是不会引发异常的代码。

这取决于具体情况。如果要为特定错误提供特殊处理,请使用多个catch块:

试试看
{ 
//引发异常的代码
//这一行不会执行
}
捕获(StackOverflowException例外)
{
//StackOverflowException的特殊处理
}
捕获(例外情况除外)
{
//所有其他
}
但是,如果目的是处理异常并继续执行,请将代码放在单独的try-catch块中:

试试看
{ 
//引发异常的代码
}
捕获(例外情况除外)
{
//处理
}
尝试
{ 
//除非上一个catch块
//引发异常(重新引发或新建异常)
}
捕获(例外情况除外)
{
//处理
}

我会选择第二个选项,但每当我看到这种代码模式时,我的第一感觉就是考虑将其拆分为多个函数/方法。显然,是否这样做取决于代码正在做什么;)

这取决于代码中发生的错误类型的性质

  • 如果你将要做的错误处理是相同的,那就尝试一下。。。捕获该组代码。否则就太乏味了

  • 如果错误需要不同的处理,请将其分开,因为您必须这样做

  • 不要对所有情况应用单一方法。大多数情况下,编程都是特定于上下文的:)

    你需要在“好/复杂”和“坏/简单”之间取得平衡。编写的代码越多,就越不会陷入这种困境:)


    快乐编程

    你想得不对。你需要在接球区做什么?如果要通过运行相同的代码从任何可能的异常中恢复,无论哪个操作引发了异常,那么请使用一个catch块。如果需要根据抛出的操作执行不同的清理操作,则使用多个catch块


    另外,如果您可以使用try/finally或该模式而不是try/catch,那么您应该这样做。

    有时我们希望向用户显示特定的错误

    try{
       try{
          ... send message
       }
       catch(exception e){
        ...log error
        ...rethrow  send related error/show custom error
       }
       try{
           ...try to receive response
       }
       catch(exception e){
           ...show receive related error
       }
       //finally close the connection
       }finally{
            ...close connection
       }
    

    +1:我完全同意,尽管我可能会这样写:“如果我可以选择第二个,我会……”,因为我认为这是在任何可能的时候都应该做的正确的事情……您希望处理在第一个错误发生时立即停止(第一个示例),还是即使处理的一部分失败(另一个)也可以继续?@DLP-我希望它停止处理-我看到有人在你之后提到它。这是一个很好的观点。虽然你用C#和.net标记了它,但我认为它确实是语言不可知论。这个问题适用于任何有例外的语言,如Java、C++、JavaScript、OcAML、Fjava、Python、Culjule等。它也适用于普通LISP和各种其他LISP中的条件/重新启动系统。所以我想请你把这门语言变得不可知……不过,你的电话费并不是很高,除非你真的抓住了什么……PS:我知道这个答案已经有7年了,但我想把它放在2017年的背景下。。。。Try/Catch对性能的影响被高估了,imaginery的性能提升从来都不是更好、更可靠代码的好理由,尤其是当你意识到.NET推出时,你能买到的最好的计算机是奔腾4 w/1-2GB ram,而今天我们有4个内核,超线程,这是速度的8倍多,8-16GB内存是标准配置。此外,即使在相同的硬件上,.NET编译的代码也比15年前快。称Try/Catch为slow是一个神话,它需要停止。一般来说,用大写字母写一整句话是很糟糕的。但最后,即特定于上下文的+1(在第一个示例中突出显示),请确保通用异常处理程序是声明中的最后一个,以便您首先处理特定异常,然后以通用方式处理超出您控制范围的任何其他异常。如下所述:,有条件捕获的使用是非标准的,不在标准轨道上。不要在面向Web的生产站点上使用它:它不会适用于所有用户。实现之间也可能存在很大的不兼容性,并且行为可能会在将来发生变化。