【发布时间】:2012-02-16 11:38:05
【问题描述】:
我有几个关于网站异常管理的问题:
-
在 catch 块中,我可以有一个带有异常处理方法的静态类,像这样处理异常:
catch (Exception ex) { throw ExceptionHandler.HandleException(...); }其中 ExceptionHandler.HandleException 是一个静态方法,它返回一个 System.Exception 类型的变量。这是一个好习惯吗?这种方法有什么可能的问题吗?它是线程安全的吗?
-
在我的应用程序中,我有一个由业务层调用的 DAL 层,而业务层由 UI 调用。那么,重新抛出所有自定义异常是否是一个好习惯,这样它们就会冒泡到显示它们的 UI 上,而 System.Exception 类型会被记录,并且我在 catch 块中抛出一个自定义异常? 例如在 DAL 和业务层中,如下所示:
catch (CustomExceptionBase ex) { throw; } catch (Exception sysEx) { ICustomExceptionBase ex = new SysException(sysEx); ex.Handle(); throw BusinessException("Some problem while serving your request"); }在 UI 层这样
catch (CustomExceptionBase ex) { //when custom exception bubbles up; code to display text to user on screen } catch (Exception sysEx) { ICustomExceptionBase ex = new SysException(sysEx); ex.Handle(); //display error on screen; }这里CustomExceptionBase实现了ICustomExceptionBase,继承了Exception。 SysException 和 BusinessException 都继承自 CustomExceptionBase。
感谢您的宝贵时间...
编辑 在 system.Exceptions 块中重新抛出的目的是,如果出现致命错误,例如数据库连接丢失或类似情况,那么我将其记录到技术帮助台并返回票号并重新抛出相同的内容,以便用户知道发生了什么事错了,这是您要跟进的参考编号。对于 DAL 层或业务层中的所有自定义异常,我只是将其一直冒泡到显示文本的 UI。
【问题讨论】:
-
嘿,如果你让它线程安全,它将是线程安全的。除此之外,我会说,如果您已经处理了异常,则不需要重新抛出它。如果您所做的只是记录异常并重新抛出它,那么 catch 块可能毫无意义。在我看来,处理异常意味着以不需要重新抛出的方式处理它。
-
点了。但是这里系统异常的意图是 1.) 记录它,这就是 ex.Handle() 会做的所有事情 2.) 提醒用户出现问题,因此抛出..
-
也许 Handle() 是一个误导性的名称...
-
我认为处理所有可能的
Exceptions 是不好的做法(除了一些警告用户并关闭应用程序的顶级代码)。只处理您知道如何处理的异常。 -
我想优雅地处理所有错误,而不向用户显示 asp.net 黄色错误屏幕:)
标签: c# exception exception-handling