首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在带有try-catch-finally的语言中,有没有可能为所有异常处理程序执行操作?

在带有try-catch-finally的语言中,有没有可能为所有异常处理程序执行操作?
EN

Stack Overflow用户
提问于 2011-04-28 21:37:32
回答 5查看 126关注 0票数 2

是否有任何语言支持类似下面的构造,或者是否有使用无处不在的try-catch-finally实现这一点的好方法?

代码语言:javascript
复制
try
{

} catch(Exception1 e)
  { .... }
  catch(Exception2 e)
  { .... }
  catch-finally
   {
      //Perform action, such as logging
   }
  finally
   {
     //This always occurs but I only want to log when an exception occurs.
   }

我知道这取决于特定的语言,但是在Java,C#,C++,PHP等语言中有这样的支持吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-28 22:30:43

将“全局”try/catch放在主程序或高级方法中。这将捕获在其他地方未捕获的所有异常。

代码语言:javascript
复制
try
{
     // Main method, or higher level method call
} 
catch (Exception ex)
{
     // Log exception here
}

然后,在从属的try/catch子句中,只需以通常的方式处理异常,然后重新抛出。重新抛出的异常将冒泡到您的主try/catch并被记录下来。

代码语言:javascript
复制
try
{
     // Do your thing
}
catch(SomeException ex)
{
     // Handle exception here

     // rethrow exception to logging handler 
     throw;
}
票数 1
EN

Stack Overflow用户

发布于 2011-04-28 21:42:57

我不这么认为,因为你所描述的行为可以很容易地建模为:

代码语言:javascript
复制
boolean success = false;

try {
  ...
  success = true;
} catch (Exception_1 e) {
  ...
}
...
} catch (Exception_N e) {
  ...
} finally {
  if (success) {
    // your "finally"
  } else {
    // your "catch-finally"
  }
}
票数 0
EN

Stack Overflow用户

发布于 2011-04-28 21:44:55

您可以在C#中轻松实现这一点。一种简单的方法是将异常保存在catch块中,如果exception对象不为空,则在finally块中记录该异常。

代码语言:javascript
复制
Exception ex;

try
{

}
catch (ExceptionType1 type1)
{
    ex = type1;
}
catch (ExceptionType2 type2)
{
    ex = type2;
}
finally
{
    if (ex != null)
    {
        //Log
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5819503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档