精华内容
下载资源
问答
  • 1、业务异常类 创建业务异常类,用来处理业务中遇到的一些异常。 import java.io.Serializable; public class ServiceException extends RuntimeException implements Serializable { private static final long ...

    全局异常处理

    1、业务异常类

    创建业务异常类,用来处理业务中遇到的一些异常。

    import java.io.Serializable;
    
    public class ServiceException extends RuntimeException implements Serializable {
    
        private static final long serialVersionUID = 1213855733833039552L;
    
        public ServiceException() {
        }
    
        public ServiceException(String message) {
            super(message);
        }
    
        public ServiceException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    

    2、全局异常处理类

    @ExceptionHandler(value = “报错类型”):这个是用来绑定报错类型的,只有对应的类型才会使用该方法进行处理。
    @ResponseBody:如果没有这个注解,程序默认的返回值是跳转的路径(例如返回"result",则程序默认以为是跳转到result.jsp这个页面),而我们返回的经常是一些数据,所以就需要添加这个注释告诉程序我们返回的是data。

    import org.springframework.web.bind.annotation.*;
    
    @ControllerAdvice
    public class GlobalException {
    
        //全局异常捕捉处理
        @ResponseBody
        @ExceptionHandler(value = Exception.class)
        public String errorHandler(Exception ex) {
            //自定义异常处理
            ex.printStackTrace();
            return ex.getMessage();
        }
    
        // 全局业务异常捕捉处理
        @ResponseBody
        @ExceptionHandler(value = ServiceException.class)
        public String serviceErrorHandler(ServiceException ex) {
            //自定义业务异常处理
            return ex.getMessage();
        }
    }
    

    3、404异常

    全局异常处理捕获不到404错误,所以需要专门写一个类用来处理404异常。

    import org.springframework.boot.web.servlet.error.ErrorController;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class NotFoundException implements ErrorController {
    
        private static final String ERROR_PATH = "/error";
    
        @Override
        public String getErrorPath() {
            return ERROR_PATH;
        }
    
        @RequestMapping(ERROR_PATH)
        public String error(){
            return "接口不存在!";
        }
    }
    
    展开全文
  • 1.业务异常:指正常的业务处理时,由于某些业务的特殊要求而导致处理不能继续所抛出的异常。 处理原则:在业务层或者业务的处理方法中抛出异常,在表示层中拦截异常,以友好的方式反馈给操作者,以便可以依据提示...

    1.业务异常:指正常的业务处理时,由于某些业务的特殊要求而导致处理不能继续所抛出的异常。

       处理原则:在业务层或者业务的处理方法中抛出异常,在表示层中拦截异常,以友好的方式反馈给操作者,以便可以依据提示信息正确的完成任务功能的处理。

    2.非业务异常:非正常工作情况下所产生的异常。

    处理原则:在应用的框架中同意拦截和处理,在开发中不需要进行任何处理。

    3.。业务异常的设计。

    1)结构上划分为3个层次。第一层:异常基类。第二层:功能层或者模块层。第三层:业务异常层。

    2)基类的构建:通常会定义一个继承自RuntimeException的基类,这样对于业务异常就可以在运行时由系统的框架进行捕获。接着为每个层次定义一个基类,最后为每个业务异常定义一个业务对象。另外为了减少异常对象的数量,在这一层也可以采用错误代码的设计方式,使得顶层的拦截程序可以依据错误代码来得到相应的错误信息。

    4.在servlet容器里处理异常。

    1)配置web.xml捕获异常。

         404

         /error.jsp

         javax.servlet.ServletException

         /error.jsp

    2)在jsp页面中使用errorPage属性进行拦截。

    5.struts的异常处理机制。

    1)异常的配置,

    配置 。属性介绍

    type:指定被处理的异常类。

    handler:指定异常处理类。默认org.apache.struts.action.ExcetionHandler,可以进行扩展。

    path:指定捕获异常并进行处理后返回的地址,可以是页面,也可以是某个action。

    key:指定错误消息的key。

    bundle:错误信息绑定的资源文件。

    scope:指定ActionMessage对象存放的范围。默认是request,也可以是session。

    方式介绍

    全局:在 中配置。

    局部:在 中配置

    2)异常信息的显示

    方法和错误信息的显示相同。

    3)定义自己的异常处理类

    继承ExceptionHandler,实现自己的异常处理类。

    覆盖execute()方法,实现自己的异常处理方法。

    将 元素中的handler属性配置为自定义的异常处理类。

    6.利用扩展Action处理异常。

    覆盖execute()方法。在异常捕获中实现自己的处理异常的方法。

    展开全文
  • 利用java filter 实现业务异常拦截 跳转到错误信息提示页面 我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理...
  • java项目中自定义业务异常

    千次阅读 2017-07-07 23:53:06
    在java Web开发过程中会遇到各种的业务异常,如扣款余额不足,重复提交,重复秒杀等,我们在后台java代码中最好的方式是将这种通过异常的方式来捕获,然后逐级上抛,最终在页面上给出提示,在网上看到的一些代码贴...

    在java  Web开发过程中会遇到各种的业务异常,如扣款余额不足,重复提交,重复秒杀等,我们在后台java代码中最好的方式是将这种通过异常的方式来捕获,然后逐级上抛,最终在页面上给出提示,在网上看到的一些代码贴出来供大家学习


    1.定义异常类

    package org.seckill.exception;
    
    /**
     * Created by zhangfx on 2017/7/7.
     */
    public class SeckillException extends RuntimeException {
        public SeckillException(String message) {
            super(message);
        }
    
        public SeckillException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    

    2.在接口的实现类中跑出异常

     @Override
        @Transactional
        public SeckillExecution executeSeckill(long seckillId, long userPhone, String md5) throws SeckillException, RepeatKillException, SeckillCloseException {
           if(md5==null||!md5.equals(getMD5(seckillId))){
               throw new SeckillException("seckill data rewrite");
           }
            //执行秒杀逻辑
            Date nowTime = new Date();
            try{
                //记录购买行为
                int insertCount = successKilledDao.insertSuccessKilled(seckillId,userPhone);
                if(insertCount<=0){
                    throw  new RepeatKillException("seckill repeated");
                }else{
                    //减库存,热点商品竞争
                    int updateCount = seckillDao.reduceNumber(seckillId,nowTime);
                    if(updateCount<=0){
                        //没有更新到秒杀记录,秒杀结束,rollback
                        throw new SeckillCloseException("seckill data rewrite");
                    }else{
                        //commit
                        SuccessKilled successKilled=successKilledDao.queryByIdWithSeckill(seckillId,userPhone);
                        return new SeckillExecution(seckillId, SeckillStatEnum.SUCCESS,successKilled);
                    }
                }
            }catch (SeckillCloseException e1){
                throw e1;
            }catch (RepeatKillException e2){
                throw e2;
            }catch (Exception e){
                logger.error(e.getMessage(), e);
                //所有编译异常转化为运行期异常
                throw new SeckillException("seckill inner error:"+e.getMessage());
            }
        }

    3.在controller中接到异常,转为相应的状态码,返回到前台

       @RequestMapping(value = "/{seckillId}/{md5}/execution",
                method = RequestMethod.POST,
                produces={"application/json;charset=UTF-8"})
        @ResponseBody
        public SeckillResult<SeckillExecution> execute(@PathVariable("seckillId") Long seckillId,
                                                       @PathVariable("md5")String md5,
                                                       @CookieValue(value="killPhone",required = false) Long phone){
            if(phone==null){
                return new SeckillResult<SeckillExecution>(false,"未注册");
            }
            SeckillResult<SeckillExecution>  result;
            try{
                //调用代码执行秒杀
                //SeckillExecution  execution= seckillService.executeSeckill(seckillId,phone,md5);
                //调用存储过程执行秒杀
                SeckillExecution  execution= seckillService.executeSeckillProcedure(seckillId,phone,md5);
                return new SeckillResult<SeckillExecution>(true,execution);
            }catch (RepeatKillException e){
                SeckillExecution execution = new SeckillExecution(seckillId, SeckillStatEnum.REPEAT_KILL);
                return new SeckillResult<SeckillExecution>(true,execution);
            }catch (SeckillCloseException e){
                SeckillExecution execution = new SeckillExecution(seckillId, SeckillStatEnum.END);
                return new SeckillResult<SeckillExecution>(true,execution);
            }catch(Exception e){
                SeckillExecution execution = new SeckillExecution(seckillId, SeckillStatEnum.INNER_ERROR);
                return new SeckillResult<SeckillExecution>(true,execution);
            }
    
        }

    4.界面上接到相应的异常状态码,然后做出相应的提示

     handleSeckillkill : function(seckillId,node){
          //处理秒杀逻辑
            node.hide()
                .html("<button class='btn btn-primary btn-lg' id='killBtn'>开始秒杀</button>");
            $.post(seckill.URL.exposer(seckillId),{},function(result){
                //在回调函数中,执行交互
                if(result && result['success']){
                    var exposer = result['data'];
                    if(exposer['exposed']){
                        //开启秒杀
                        //获取秒杀地址
                        var md5 = exposer['md5'];
                        var killUrl = seckill.URL.execution(seckillId,md5);
                        console.log("killUrl:"+killUrl);
                        //绑定一次点击事件
                        $('#killBtn').one('click',function(){
                            //绑定秒杀请求
                            //1.先禁用按钮
                            $(this).addClass('disabled');
                            //2.发送秒杀请求
                            $.post(killUrl,{},function(result){
                                if(result && result['success']){
                                    var killResult = result['data'];
                                    var state = killResult['state'];
                                    var stateInfo = killResult['stateinfo'];
                                    //显示秒杀结果
                                    node.html('<span class="label label-success">'+stateInfo+'</span>');
                                }
                            });
                        });
                        node.show();
                    }else{
                        //未开启秒杀
                        var now = exposer['now'];
                        var start = exposer['start'];
                        var end = exposer['end'];
                        //重新计算逻辑
                        seckill.countdown(seckillId,now,start,end);
                    }
                }else{
                    console.log('result'+result);
                }
    
            });
        }







    展开全文
  • Java之业务异常类BusinessException封装实例

    万次阅读 多人点赞 2016-06-03 21:46:53
    开心一笑幼儿园搞活动,共有三个班,每个班出场时,要喊口号/坏笑 小一班喊的口号是:“小一,小一,勇争第一。”/拳头 ...解决问题首先是开发一个BusinessException业务异常类,继承BusinessExc

    开心一笑

    幼儿园搞活动,共有三个班,每个班出场时,要喊口号/坏笑
    小一班喊的口号是:“小一,小一,勇争第一。”/拳头
    小二班口号是:“小二,小二,独一无二。”/强
    等到小三班出场,喊出了令在场所有人都乐趴下的口号:“小三,小三,爸爸的心肝!”
    全场昏倒!

    视频教程

    大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……

    视频地址:http://edu.csdn.net/lecturer/994

    提出问题

    如何对项目的业务异常类进行封装处理???

    解决问题

    首先是开发一个BusinessException业务异常类,继承BusinessException,用来统一处理业务出现的各种异常。具体细节可以看类中的注释

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.evada.inno.core.exception;
    
    import com.evada.inno.common.constants.IMessage;
    import com.evada.inno.core.util.I18nUtils;
    import java.text.MessageFormat;
    import org.apache.commons.lang3.StringUtils;
    /** 这里继承RuntimeException异常 **/
    public class BusinessException extends RuntimeException {
    private static final long serialVersionUID = 2332608236621015980L;
    /** 错误码 **/
    private IMessage errorCode;
    private String type = "B-";
    private Object[] msgArgs;
    /** 用于存放后端返回的数据 **/
    private Object data;
    
    public BusinessException(Throwable cause) {
        super(cause);
    }
    
    public BusinessException(String message) {
        super(message);
    }
    
    public BusinessException(String message, Throwable cause) {
        super(message, cause);
    }
    
    public BusinessException(IMessage errorCode) {
        this.errorCode = errorCode;
    }
    
    public BusinessException(IMessage errorCode, Object data) {
        this.data = data;
        this.errorCode = errorCode;
    }
    
    public BusinessException(IMessage errorCode, Throwable cause) {
        super(cause);
        this.errorCode = errorCode;
    }
    
    public BusinessException(IMessage errorCode, Object[] msgArgs) {
        this.errorCode = errorCode;
        this.msgArgs = msgArgs;
    }
    
    public BusinessException(IMessage errorCode, Object[] msgArgs, Throwable cause) {
        super(cause);
        this.errorCode = errorCode;
        this.msgArgs = msgArgs;
    }
    
    public Object[] getMsgArgs() {
        return this.msgArgs;
    }
    
    public void setMsgArgs(Object[] msgArgs) {
        this.msgArgs = msgArgs;
    }
    
    public String getMsg() {
        String msg = "";
        if(this.errorCode == null) {
            msg = this.getMessage();
            return msg;
        } else {
            try {
                //这里只要知道可以通过错误码获得相关错误信息
                msg = I18nUtils.getMessage(this.errorCode, this.getMsgArgs());
            } catch (Exception var3) {
                msg = MessageFormat.format("错误代码: {0}, 错误参数: {1}, 国际化消息读取失败!", new Object[]{Integer.valueOf(this.errorCode.getCode()), StringUtils.join(this.getMsgArgs(), "|")});
            }
    
            return msg;
        }
    }
    
    public String getType() {
        return this.type;
    }
    
    public void setType(String type) {
        this.type = type;
    }
    
    public IMessage getErrorCode() {
        return this.errorCode;
    }
    
    public void setErrorCode(IMessage errorCode) {
        this.errorCode = errorCode;
    }
    
    public Object getData() {
        return this.data;
    }
    
    public void setData(Object data) {
        this.data = data;
    }
    }
    

    IMessage类代码如下:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.evada.inno.common.constants;
    
    public interface IMessage {
        String getCategory();
    
        int getCode();
    }
    

    ErrorCode类代码:

    package com.evada.de.common.constants;
    
    import com.evada.inno.common.constants.IMessage;
    
    /**
     * DE应用的错误码
     * 4位错误码定义:
     * 首位,应用标识(DE为3);
     * 二号位,应用模erprise:2 |块标识(common:0 | core:1 | ent file-manage:3 | project:4 | requirement-component:5 | work-flow:6 | architecture:7);
     * 三四位为错误码
     * Created by KQY on 2015/12/24.
     */
    public interface ErrorCode extends com.evada.inno.common.constants.ErrorCode {
    
        enum De implements IMessage {
    
            /**
             *数据存在冲突,是否覆盖更新!
             */
            dataObjectConflict(3731),
    
            /**
             * 该系统已被IT估算所引用,不能删除!
             */
            quotationDontDel(3429);
    
            private int code;
            private String category;
    
            De(int code) {
                this.code = code;
                this.category = this.getClass().getSimpleName();
            }
    
            public int getCode() {
                return code;
            }
    
            public String getCategory() {
                return category;
            }
        }
    }
    

    messages_zh_CN.properties文件

    Common.invalidErrorCode=错误码无法识别!
    De.dataObjectConflict=数据存在冲突,是否覆盖更新!
    De.quotationDontDel={0}已被IT估算所引用,不能删除!
    

    最后是如何在项目中使用:

    /**
     * 创建规则指引
     *
     * @param deGuidanceRuleDTO
     * @return
     */
    @Override
    public DeGuidanceRuleDTO create(DeGuidanceRuleDTO deGuidanceRuleDTO) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        DeGuidanceRule guidanceRule = GuidanceRuleRepository.findByRuleName(deGuidanceRuleDTO.getRuleName());
        if(guidanceRule!=null){
            //重点在这里,只要出现业务异常,统一抛出业务异常类,传入相关的错误码即可
            throw new BusinessException(ErrorCode.De.alreadyExists);
    
        }
        DeGuidanceRule deGuidanceRule = new DeGuidanceRule();
        deGuidanceRuleDTO.setId(UUIDUtils.generate());
        deGuidanceRuleDTO.setStatus(StatusEnum.ENABLE.toString());
        deGuidanceRuleDTO.setType(ArchitectureStatusEnum.UN_START.toString());
        //添加文件关联
        addFileRelations(deGuidanceRuleDTO.getId(), deGuidanceRuleDTO.getFiles());
        PropertyUtils.copyProperties(deGuidanceRule, deGuidanceRuleDTO);
        GuidanceRuleRepository.saveAndFlush(deGuidanceRule);
        return GuidanceRuleDAO.findDtoById(deGuidanceRule.getId());
    }
    

    读书感悟

    • 不管你曾经被伤害得有多深,总会有一个人的出现,让你原谅之前生活对你所有的刁难。
    • 到不了的地方都叫做远方,回不去的世界都叫做家乡,我一直向往的却是比远更远的地方。
    • 你说你会爱我一辈子,我真傻,居然忘了问“是这辈子还是下辈子” 。

    其他

    如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!

    展开全文
  • 21. 区分业务异常和技术异常

    千次阅读 2013-08-24 13:52:48
    区分业务异常和技术异常  应用程序在运行时出错基本上是两个原因:阻止我们使用程序的技术问题和阻止我们错误地使用程序的业务逻辑。现代编程语言,例如LISP,Java,Smalltalk和C#,使用异常来标识这两种情形。...
  • 1、缘由:我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理机制,我们在业务层会跑出我们遇到业务处理异常 ,...
  • 1、缘由:我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理机制,我们在业务层会跑出我们遇到业务处理异常 ,...
  • 在后台抛出业务异常时,会在前端界面弹出消息提示框,并中断程序。 在前端页面(EAS客户端,GUI)中断程序时可使用abort(),但是abort()仅用于中断程序,消息提示需在中断之前处理。 /**  * 抛出业务异常  */ ...
  • 随着越来越多的在线业务被迁移到基于云的平台 上,如何检测云平台上在线业务异常运行状态成为了一 个重要的问题.现有方法通过分析在线业务的实时负载数 据来判断业务是否存在异常,在应对由程序异常或突发用 户访问...
  • 使用springboot框架快速搭建,封装自定义断言做业务校验,公共异常处理打印日志, 更简单的业务判断处理
  • Dubbo如何正确捕获业务异常

    千次阅读 2019-02-09 21:28:17
    笔者所在的公司,项目正在重构,从一个SpringBoot项目往Dubbo上迁移,但在拆分后发现一个问题,服务消费者(后文用Consumer代替)无法正确捕获服务提供者(后文用provider代替)所抛出的非受检查异常。在未拆分之前,...
  • 1.全局异常处理 import com.bossien.common.comm.entity.ResponseDto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org...
  • 但是太过繁琐,对业务开发非常不友好。如何才可以不关心这类异常呢?全部往外抛呢。 如何优雅地处理? 声明一个全局异常捕获的切 /** * 统一异常处理:针对没有显式捕获异常的controller */ @...
  • 估计大家都遇到过线上应用出了问题,短时间内异常日志打了几百M或是几个G,这种情况下,如何判断异常日志中与业务相关的异常信息有多少种呢? 1. 查找异常日志中业务代码包关键字,导出到一个文件中,例如这里搜索...
  • 目前单日完成订单两千多万单,交易频次高,如果不能及时发现潜在业务指标异常,有可能引发重大事故。 写在前面 外卖业务持续高速成长,业务迭代快,逻辑复杂,关联服务多。如何快速准确识别系统各项指标的异常,...
  • JAVA-乐观锁更新失败或业务异常后接口重试

    千次阅读 热门讨论 2019-07-03 14:12:43
    3、在业务异常出抛出指定异常即可,建议抛出框架定义的异常RetryException。 总结 建议大家还是使用框架,有兴趣和能力的小伙伴可以看下源码。但是第一种方式的AOP思想还是要了解的。  
  • 在业务实现过程中,我们可能会有类似如下的场景,要实现一个下单功能,除了下单正常执行的流程之外,我们还可能需要处理各种的业务异常情况,比如说下单的用户在服务端找不到,下单的商品在服务端找不到等等的业务...
  • 业务逻辑异常和执行异常处理集锦

    千次阅读 2018-10-19 13:08:00
    业务逻辑异常和执行异常】对于异常我们只分业务逻辑异常(不符合业务规则的异常)和执行异常(系统自己的异常,比如什么conn出错,某某dll缺少依赖)业务规则异常自己继承实现一个mylogic异常类就行,无论你是什么...
  • 利用Spring AOP实现业务异常日志记录
  • 需求:按当前项目工程的组织结构,业务模块被分为多个独立的Module,要求当业务模块内发生未捕获到的局部异常时,不重启整个应用,只是单独重启某个异常业务模块 目前安卓中常用的异常捕获有两种方式: 一种是局部...
  • Java自定义异常(优雅的处理异常)

    万次阅读 多人点赞 2018-03-16 15:38:59
    在复杂业务环境下,java自带的异常可能满足不了我们业务的需求, 这个时候我们可以自定义异常来进行对业务异常的处理; 首先,我们先对异常进行基本的解释: Throwable是所有Java程序中错误处理的父类 ,有两种子类:...
  • 业务代码中如何处理和使用异常

    千次阅读 2019-09-17 17:56:42
    业务代码中如何处理和使用异常 背景 近期发生多起接口处理异常但是没有报警,不能及时发现和定位。我们展开了对业务代码review和回归,做好异常的处理 异常的使用 在我们的业务中,业务流程大致可以分为参数校验,...
  • java web后台使用异常控制业务流程

    千次阅读 2018-08-03 18:37:59
    在web后台使用controller、service、dao模式开发时。controller负责调用业务方法和返回前台数据,service层负责处理业务逻辑返回...对于复杂的异常情况(非程序异常)来说是不够的,所以返回的都是正常业务的数据。 ...
  • 【Java】J2EE异常处理设计整理

    万次阅读 2020-02-17 19:46:15
    1. 业务异常介绍 我们在处理应用中的异常时,通常可以将应用中所遇到的异常分为两大类,一种是业务异常,一种是非业务异常业务异常是指在进行正常的业务处理时,由于某些业务的特殊需求而导致处理不能继续执行所...
  • 最近在Midwayjs框架上搭建服务端项目,一个请求进来,执行链比较长,中间一旦出现校验不通过,需要进行异常处理,如果要在业务代码中进行异常处理十分麻烦且难以维护,从而引申出如何优雅地处理异常。 最简单的方式...
  • 全局异常方式处理自定义异常

    千次阅读 2018-08-29 09:09:13
     本文讲解使用 @ControllerAdvice + @ExceptionHandler 进行全局的 Controller 层异常处理,可以处理大部分开发中用到的自自定义业务异常处理了,再也不用在 Controller 层进行 try-catch 了  文章结尾附带项目...
  • 自定义异常BusinessException

    千次阅读 2018-07-10 09:37:45
    * 业务异常, 需要对外抛错。 * 1. 接管异常信息 * 2. 单据信息与后台信息交互 * 3. 业务错误进行回滚 *  * @XXX * */ public class BusinessException extends RuntimeException{ private static final long ...
  • 我们可不可以统一处理业务逻辑然后给出前端对应的异常提醒内容呢? 本章目标 基于SpringBoot平台构建业务逻辑异常统一处理,异常消息内容格式化。 SpringBoot 企业级核心技术学习专题 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475,034
精华内容 190,013
关键字:

业务异常