首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用堆栈中捕获高异常-当处理n层时?

在调用堆栈中捕获高异常-当处理n层时?
EN

Stack Overflow用户
提问于 2011-01-04 10:59:10
回答 4查看 989关注 0票数 1

假设我有3层应用程序-前端域和数据访问。我读到过,如果我得到一个数据访问异常,那么在调用stack...so中捕获高级别的异常是一个好主意,域层只做一个finally,如下所示

尝试{

}终于{//清理完毕}

并让数据访问异常渗透到前端层。这不是通过让前端层处理内部而打破了分层吗?我认为每一层都应该要么处理它无法处理的调用层的异常,要么包装并抛出异常……有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-05 00:48:14

到目前为止,有很多很好的反馈,我会给你我的观点。

规则1.只捕获你要实际处理的异常。通过句柄,我的意思是以这样一种方式处理,使客户端的请求可以继续。您可能会捕获足够长的内容来记录信息(不要滥用这一点,通常堆栈就足够了),或者转换为更容易传播的不同错误(基于ala运行时)。但是,如果你不能处理它,就别费心去抓它了。这只是无用和令人困惑的额外代码。即使当您登录或转换时,您最终也会重新抛出。

认识到大多数时候,你不能处理一个异常。真的。许多人没有领会到这一点。但现实是,如果你得到一个IOException读或写磁盘,游戏就结束了。无法为用户完成该请求。如果您的网络不稳定,并且您无法与数据库通信,也是如此。

规则#2.当你得到一个你无法处理的异常时,你唯一能做的就是尝试以一种对用户有帮助的方式失败。这意味着,将其记录下来以供以后分析(包括原始堆栈/原因),然后向用户报告一些尽可能有帮助的东西。清理您必须做的任何事情,以便系统保持一致的状态。

鉴于这种与最终用户的通信发生在非常高的级别,这意味着您通常必须在该级别进行捕获。大多数时候,我发现在它的起始点和顶层之间的任何异常处理中都没有什么价值,您可以在顶层捕获它以记录日志并向用户报告。我经常转换为RuntimeException的一种形式,但这样做只是为了简化在各层中的传播。

最重要也是最重要的事情是认识到你通常不能处理异常,所以你为它们编写的任何代码都应该尽可能简单。

票数 1
EN

Stack Overflow用户

发布于 2011-01-04 11:06:58

我不认为分层是一个纯粹的想法,这会破坏它。

包装和重新抛出也不会增加太多价值。

让服务层处理异常有什么错?那应该是防线的尽头,最后一道防线。这种设计允许服务一次性地记录异常,并向UI发送用户友好的消息以供显示。

票数 0
EN

Stack Overflow用户

发布于 2011-01-04 11:13:16

您通常希望捕获调用堆栈中更高的异常,但只捕获到有意义的点。如果数据层可以处理和记录异常,并且只将一条消息传递回前端,那么这将使事情变得简单和灵活。

就我个人而言,如果我需要尝试最后一次,那么我也想捕捉并对那里的情况做一些事情,而不是把它传递给调用者。请记住,好的设计规则总是有例外的(通常是另一条规则,如KISS)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4590295

复制
相关文章

相似问题

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