在witrix平台中,异常处理没有采用java语法支持的checked exception,
也不提倡使用自定义的异常类,
而是定义了少数几个RuntimeException基类,一般是CommonException(RuntimeException的派生类)。
在我自己的经验中,checked exception从未发挥过实质性的作用。checked
exception在某种程度上破坏了封装性原则。我们一般不会在最细的粒度上处理异常,而是在某个统一的模块节点处进行。如果使用checked
exception,
则从最底层的调用到具体异常处理层的整个调用堆栈上的函数都必须明确标记自己不处理该异常,这是完全不必要的负担。这种细粒度上的负担往往将程序员引导到
错误的方向上去,例如编写catch块直接捕获异常
try{
...
}catch(MyException e){
e.printStackTrace();
}
在witrix平台中通过包装类来将checked exception包装为RuntimeException, 而且除了在最终代码处理模块决不屏蔽异常。
try{
...
}catch(IOException e){
throw Exceptions.source(e); // 此时会自动trace异常堆栈及异常消息
}
(后来看到Bruce Eckel的文章Does Java need Checked Exception,发现大家在对待checked exception的态度上倒是心有戚戚焉。)
一般使用自定义的异常类似乎是要将类名作为错误返回码使用,利用java编译器可以做所谓的强类型检查,这实在是一种概念上的浪费。毕竟创建并维护一个
java类还是有一定的代价的,特别是错误码经常变动而且数量不菲。实际上,java类库的设计中也是尽量重用已有的异常类,例如整个jdbc包只抛出
SQLException异常,xml包只抛出SAXException异常。
使用异常,常见的方法是抛出一个字符串消息,例如 throw new
MyException("the object manager does not contains the object :" +
objectName);
这种做法的主要问题是,字符串异常消息无法进行进一步的处理,因而只能直接显示给最终用户,这一方面限制了错误显示的格式和方式,另一方面也不利于程序的多语言支持。
witrix平台中抛出异常的标准方法为
throw Exceptions.code(errorCode).param(paramValue).param(paramName,paramValue);
例如
throw Exceptions.code("web.CAN_err_missing_object_in_manager").param(objectName).param(objectManager);
class Exceptions{
public static CommonException code(String errorCode){
return new CommonException(code);
}
}
class CommonException extends RuntimeException{
public CommonException param(Object paramValue){
...
return this;
}
}
Exceptions规定只使用规范格式的错误码而不是任意格式的异常消息。这样在捕获异常之后,就可以根据错误码和当时的语言Locale设置来决定最终显示的消息格式。
同时CommonException采用流式设计来支持任意数量的自定义参数。这一方面减少了自定义异常类的需求,另一方面也避免了将参数与错误码混合的倾向,即我们就不会倾向于
使用 throw Exceptions.code("the object manager does not contains the object :" + objectName);
分享到:
相关推荐
Exceptions:异常处理
例外 探索异常 有关此代码的详细信息位于的博客文章中
Python中的漂亮,更有用的异常。 用法 通过pip安装better_exceptions : $ pip install better_exceptions 并将BETTER_EXCEPTIONS环境变量设置为任何值: export BETTER_EXCEPTIONS=1 # Linux / OSX setx BETTER...
然而,当前的模型缺乏一种系统的方法来处理异常作为其设计的一部分。 因此,异常处理通常由临时解决方案来处理,这阻碍了代码模块化和解耦。 我们展示了 Moise 的扩展,即 JaCaMo 中采用的组织模型和基础架构,它...
处理异常输出。 处理异常报告到日志。 覆盖默认的Validator以使验证错误更加冗长。 有一个FormRequest来处理验证错误,并将它们传递给ApiExceptions层。 安装 5.4+或 3.3 +, 和 5.1+。 要获取最新版本的...
Vgv例外更新: 该库用作面向对象的异常处理的 。 请参考该项目。 异常处理功能在CheckedScalar / ScalarWithFallback和相关的Checked*类中实现。 更多细节如何使用。 最新版本< dependency> < groupId>hr....
该软件包提供了(可选的纯)可扩展异常,这些异常与monad转换器库兼容。 联系信息 欢迎提供贡献和错误报告! 请随时通过github或irc.freenode.net上的#haskell IRC频道与我联系。 爱德华·克梅特(Edward Kmett)
Java 自定义异常Java 自定义异常以下是创建自定义异常的两个不同示例。 有更多方法可以做到这一点,但这里是(可以说)我遇到的最简单的方法。
安全例外安全,一致且易于处理的异常 该库的文档可在上 长久以来,运行时异常(由Control.Exception模块在base公开)一直是Haskell生态系统中令人生畏的一部分。 该程序包以及该程序包的自述文件旨在解决此问题。 它...
Serilog.Exceptions是Serilog的附加用于记录Exception.ToString()中未输出的异常详细信息和自定义属性。它有什么作用? 现在,您的JSON日志将补充详细的异常信息,甚至是自定义异常属性。 这是当您从EntityFramework...
例外情况异常处理的基类!!! 警告 !!! 尚未准备生产
Laravel例外Laravel Exceptions由创建并维护,并为开发和生产提供了强大的错误响应系统。 它可以选择将软件包用于开发错误页面。 随时检查,,,,和。安装Laravel异常需要 7.2-8.0。 此特定版本支持Laravel 7-8。 ...
EntityFramework.Exceptions通过处理所有数据库特定的详细信息并抛出不同的异常来简化此操作。 您所要做的就是通过调用UseExceptionProcessor来配置DbContext并处理所需的异常,例如UniqueConstraintException , ...
十分方便的一个asp.net的日志管理dll。无需写代码,只要配置一下就可以。 是一款ASP.NET下的系统错误记录管理工具,它可以非常方便的把“黄屏”错误记录到XML,MS SQLServer,SQLite,MySql等文件中,甚至它还可以...
var EsEx = require('elasticsearch-exceptions'); someRequestToElasticSearchOrUsingANodeJSClient(function(err, ok){ if(EsEx.isAliasesMissingException(err)){ // do something else } if(err){ // do ...
Laravel开发-exceptions 错误异常处理工具,支持开发和生产环境,使用 Whoops 进行错误显示 错误异常处理工具,支持开发和生产环境,使用whoops进行错误显示
retry_on_exceptions 装饰器用于通过捕获指定的异常之一然后重试来重试函数 N 次的装饰器。 对于偶尔抛出错误的函数特别有用,例如依赖外部资源(如 Web API、数据库等)的函数。 安装: pip install retry_on_...
Laravel 5 Email Exceptions软件包基于此出色的cakephp软件包( ),旨在为开发人员提供一种简单的方法,以便在引发异常时通过电子邮件将调试信息发送给自己在他们的应用中。 默认情况下提供的信息是: 环境 异常/...
漂亮的例外自动生成漂亮且更有用的未捕获异常。用法图书馆const pretty = require ( 'pretty-exceptions/lib' )const options = { source : true , native : true , color : true , cwd : process . cwd ( )}const ...
使用Spring Boot处理REST控制器中的错误目标该示例代码显示了如何配置Spring Boot应用程序以正确处理所有异常并创建自定义错误格式。 查看ThePracticalDeveloper网站上的以获取带有说明的完整指南。 并且,如果您...