通用异常处理框架

合集下载

java异常处理机制

java异常处理机制

java异常处理机制
Java的异常处理是结构化编程的一个重要方面。

它提供了一种通用的方式来处理发生在应用程序或系统中的异常,比在代码中添加报错信息更有效。

Java异常处理模型包括异常类,异常处理器,throw和throws关键字以及堆栈跟踪。

异常类是Java的一种特殊类,它表示程序的异常状态(或者是错误情况)。

它从Java的Throwable类继承,Throwable类有两个子类,Exception和Error,它们派生出一组定义在Java中的异常。

异常处理器允许处理一个或多个特定类型的异常,是程序中处理异常的机制。

异常处理器通常作为程序的一部分,程序员可以通过编写异常处理器来为应用程序创建一个可以处理未知错误的安全环境。

Throw和throws关键字用于抛出异常。

Throw关键字用于将异常抛出到当前函数的调用点,throws关键字用于声明哪些异常可以被抛出,以便该方法的调用者可以捕获和处理它们。

堆栈跟踪是一种异常处理工具,可以展示异常期间应用程序运行的具体位置,同时可以追踪嵌套方法调用,并可以提供出现异常时的参数值,类型等等。

Java的异常处理机制为程序员提供了一种有效的处理在程序的运行过程中可能会发生的系统或应用程序异常的方法。

它可以保护应用程序免受非正常状况的危害,提高程序的安全性和效率。

Spring异常处理三种方式@ExceptionHandler

Spring异常处理三种方式@ExceptionHandler

Spring异常处理三种⽅式@ExceptionHandler问题描述: 假如对异常不进⾏处理?假如SpringMvc我们不对异常进⾏任何处理, 界⾯上显⽰的是这样的.异常处理的⽅式有三种:⼀. Controller层⾯上异常处理 @ExceptionHandler说明:针对可能出问题的Controller,新增注解⽅法@ExceptionHandler.@Controller@RequestMapping("/testController")public class TestController {@RequestMapping("/demo1")@ResponseBodypublic Object demo1(){int i = 1 / 0;return new Date();}@ExceptionHandler({RuntimeException.class})public ModelAndView fix(Exception ex){System.out.println("do This");return new ModelAndView("error",new ModelMap("ex",ex.getMessage()));}}注意事项: 1. ⼀个Controller下多个@ExceptionHandler上的异常类型不能出现⼀样的,否则运⾏时抛异常.Ambiguous @ExceptionHandler method mapped for;2. @ExceptionHandler下⽅法返回值类型⽀持多种,常见的ModelAndView,@ResponseBody注解标注,ResponseEntity等类型都OK.原理说明:代码⽚段位于:org.springframework.web.servlet.DispatcherServlet#doDispatch执⾏@RequestMapping⽅法抛出异常后,Spring框架 try-catch的⽅法捕获异常, 正常逻辑发不发⽣异常都会⾛processDispatchResult流程,区别在于异常的参数是否为null .HandlerExecutionChain mappedHandler = null;Exception dispatchException = null;ModelAndView mv = null;try{mappedHandler=getHandler(request); //根据请求查找handlerMapping找到controllerHandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());//找到处理器适配器HandlerAdapterif(!mappedHandler.applyPreHandle(request,response)){ //拦截器preHandlereturn ;}mv=ha.handle(request,response); //调⽤处理器适配器执⾏@RequestMapping⽅法mappedHandler.applyPostHandle(request,response,mv); //拦截器postHandle}catch(Exception ex){dispatchException=ex;}processDispatchResult(request,response,mappedHandler,mv,dispatchException) //将异常信息传⼊了代码⽚段位于:org.springframework.web.servlet.DispatcherServlet#processDispatchResult如果@RequestMapping⽅法抛出异常,拦截器的postHandle⽅法不执⾏,进⼊ processDispatchResult,判断⼊参 dispatchException,不为null , 代表发⽣异常,调⽤processHandlerException处理,代码⽚段位于:org.springframework.web.servlet.DispatcherServlet#processHandlerExceptionthis当前对象指dispatchServlet,handlerExceptionResolvers可以看到有三个HandlerExceptionResolver, 这三个是<mvc:annotation-driven />帮我们注册的. 遍历有序集合handlerExceptionResolvers,调⽤接⼝的resolveException⽅法.记录<mvc:annotation-driven/>注册的第⼀个 HandlerExceptionResolver : ExceptionHandlerExceptionResolver, 继承关系如下⾯所⽰.代码⽚段位于:org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver#resolveExceptionAbstractHandlerExceptionResolver 和 AbstractHandler Method ExceptionResolver名字看起来⾮常相似. 这⾥AbstractHandlerExceptionResolver 的shouldApplyTo都返回 true, logException⽤来记录⽇志、prepareResponse⽅法⽤来设置response的Cache-Control. 异常处理⽅法就位于doResolveException.代码⽚段位于:org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver#shouldApplyTo接⼝⽅法实现是AbstractHandlerExceptionResolver的resolveException,先判断 shouldApplyTo, AbstractHandlerExceptionResolver 和⼦类AbstractHandler Method ExceptionResolver都实现了shouldApplyTo⽅法,⼦类的shouldApplyTo都调⽤⽗类AbstractHandlerExceptionResolver的shouldApplyTo.查看⽗类AbstractHandlerExceptionResolver的shouldApplyTo⽅法.代码⽚段位于:org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver#shouldApplyToSpring初始化的时候并没有额外配置 , 所以mappedHandlers和mappedHandlerClasses都为null, 可以在这块扩展进⾏筛选,AbstractHandlerExceptionResolver提供了setMappedHandlerClasses 、setMappedHandlers⽤于扩展.代码⽚段位于:org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver#doResolveException代码⽚段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#doResolveHandlerMethodException似曾相识的ServletInvocableHandlerMethod,getExceptionHandlerMethod⽬的就是获取针对异常的处理⽅法,没找到的话这⾥就直接返回了,找到了执⾏异常处理⽅法;之后同Spring请求⽅法执⾏⼀样的处理⽅式,设置argumentResolvers、returnValueHandlers,之后进⾏调⽤异常处理⽅法,@ExceptionHandler的⽅法⼊参⽀持:Exception ;SessionAttribute 、 RequestAttribute注解; HttpServletRequest 、HttpServletResponse、HttpSession.@ExceptionHandler⽅法返回值常见的可以是: ModelAndView 、@ResponseBody注解、ResponseEntity;getExceptionHandlerMethod说明:获取对应的@ExceptionHandler⽅法,封装成ServletInvocableHandlerMethod返回.代码⽚段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#getExceptionHandlerMethodexceptionHandlerCache是针对Controller层⾯的@ExceptionHandler的处理⽅式,⽽exceptionHandlerAdviceCache是针对@ControllerAdvice的处理⽅式. 这两个属性都位于ExceptionHandlerExceptionResolver中.handlerType指代Controller的class属性,尝试从缓存A exceptionHandlerCache 中根据controller的class 查找ExceptionHandlerMethodResolver;缓存A之前没存储过Controller 的class ,所以新建⼀个ExceptionHandlerMethodResolver 加⼊缓存中. ExceptionHandlerMethodResolver 的初始化⼯作⼀定做了某些⼯作!resolveMethod⽅法:根据异常对象让 ExceptionHandlerMethodResolver 解析得到 method ,匹配到异常处理⽅法就直接封装成对象 ServletInvocableHandlerMethod ;就不会再去⾛@ControllerAdvice⾥的异常处理器了. 这⾥说明了,ExceptionHandlerMethodResolver 初始化的时候完成存储 @ExceptionHandler.查看ExceptionHandlerMethodResolver 初始化⼯作内容:代码⽚段位于:org.springframework.web.method.annotation.ExceptionHandlerMethodResolver#ExceptionHandlerMethodResolverhandlerType为传⼊的Controller的class属性,通过EXCEPTION_HANDLER_METHODS选出 class 中标注@ExceptionHandler的⽅法,解析@Exception注解的value值(class类型的数组),并加⼊到当前ExceptionHandlerMethodResolver的mappedMethods集合中,key为异常类型,value为 method.如果@ExceptionHandler的 value属性为空,就会将⽅法⼊参中的Throwable的⼦类作为异常类型. @ExceptionHandler的value属性和⽅法⼊参不能同时都为空,否则会抛出异常.ExceptionHandlerMethodResolver完成了初始化⼯作,如何根据当前发⽣异常类型查找到对应⽅法?代码⽚段位于:org.springframework.web.method.annotation.ExceptionHandlerMethodResolver#resolveMethodresolveMethodByExceptionType根据当前抛出异常寻找匹配的⽅法,并且做了缓存,以后遇到同样的异常可以直接⾛缓存取出method,代码⽚段位于:org.springframework.web.method.annotation.ExceptionHandlerMethodResolver#resolveMethodByExceptionTyperesolveMethodByExceptionType⽅法,尝试从缓存A:exceptionLookupCache中根据异常class类型获取Method ,初始时候肯定缓存为空,就去遍历ExceptionHandlerMethodResolver的mappedMethods(上⾯提及了key为异常类型,value为method), exceptionType为当前@RequestMapping⽅法抛出的异常,判断当前异常类型是不是@ExceptionHandler中value声明的⼦类或本⾝,满⾜条件就代表匹配上了;可能存在多个匹配的⽅法,使⽤ExceptionDepthComparator排序,排序规则是按照继承顺序来(继承关系越靠近数值越⼩,当前类最⼩为0,顶级⽗类Throwable为int最⼤值),排序之后选取继承关系最靠近的那个,并且存⼊ExceptionHandlerMethodResolver的exceptionLookupCache中,key为当前抛出的异常,value为解析出来的匹配method.⾄此 @ExceptionHandler Spring读取到并解析出来完毕了,后续流程和Spring正常请求流程⼀样,包括@ExceptionHandler的⽅法⼊参、⽅法返回值.@ExceptionHandler的⽅法⼊参⽀持:Exception ;SessionAttribute 、 RequestAttribute注解; HttpServletRequest 、HttpServletResponse、HttpSession.@ExceptionHandler⽅法返回值常见的可以是: ModelAndView 、@ResponseBody注解、ResponseEntity;⼆. 全局级别异常处理器实现HandlerExceptionResolver接⼝public class MyHandlerExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("发⽣全局异常!");ModelMap mmp=new ModelMap();mmp.addAttribute("ex",ex.getMessage());return new ModelAndView("error",mmp);}}使⽤⽅式:只需要将该Bean加⼊到Spring容器,可以通过Xml配置,也可以通过注解⽅式加⼊容器;⽅法返回值不为null才有意义,如果⽅法返回值为null,可能异常就没有被捕获.缺点分析:⽐如这种⽅式全局异常处理返回JSP、velocity等视图⽐较⽅便,返回json或者xml等格式的响应就需要⾃⼰实现了.如下是我实现的发⽣全局异常返回JSON的简单例⼦.public class MyHandlerExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("发⽣全局异常!");ModelMap mmp=new ModelMap();mmp.addAttribute("ex",ex.getMessage());response.addHeader("Content-Type","application/json;charset=UTF-8");try {new ObjectMapper().writeValue(response.getWriter(),ex.getMessage());response.getWriter().flush();} catch (IOException e) {e.printStackTrace();}return new ModelAndView();}}原理分析:记得之前介绍了 DispatcherServlet的HandlerExceptionResolver集合,这种⽅式的HandlerExceptionResolver就是从DispatcherServlet的HandlerExceptionResolver集合⼊⼿的.代码⽚段位于:org.springframework.web.servlet.DispatcherServlet#processHandlerExceptionthis对象指代DispatcherServlet,和上⾯⽅式对⽐,发现我们只是将MyHandlerExceptionResolver 加⼊到Spring容器,dispatchServlet 的 handlerExceptionResolvers属性就多了我们⾃⼰定义的全局异常解析器;ExceptionHandlerMethodResolver是⽤来解析@Controller层⾯的@ExceptionHandler注解,当前Controller没有找到@ExceptionHandler来处理⾃⼰抛出的异常,才遍历下⼀个HandlerExceptionResolver;HandlerExceptionResolver是个有序集合,Spring注册的HandlerExceptionResolver调⽤resolveException都失败之后,才轮到我们⾃定义的MyHandlerExceptionResolver ;⽽且我们⾃定义的MyHandlerExceptionResolver 就没法使⽤SpringMvc的注解等等.我们只是将HandlerExceptionResolver加⼊到Spring容器中,Spring是如何通知给DispatcherServlet呢?代码⽚段位于:org.springframework.web.servlet.DispatcherServlet#initHandlerExceptionResolversinitHandlerExceptionResolvers只是DispatcherServlet初始化策略⽅法initStrategies中的⼀⼩步,可以看到只要是SpringMvc⽗⼦容器中注册的HandlerExceptionResolver类型实例,DispatcherServlet都会⾃动将其加⼊到DispatcherServlet的handlerExceptionResolvers中. 所以我们需要做的只是实现HandlerExceptionResolver接⼝,并且纳⼊Spring容器管理即可.三.全局级别异常处理器 @ControllerAdvice简单使⽤⽅法:@ControllerAdvicepublic class GlobalController {@ExceptionHandler(RuntimeException.class)public ModelAndView fix1(Exception e){System.out.println("全局的异常处理器");ModelMap mmp=new ModelMap();mmp.addAttribute("ex",e);return new ModelAndView("error",mmp);}}⽤法说明: 这种情况下 @ExceptionHandler 与第⼀种⽅式⽤法相同,返回值⽀持ModelAndView,@ResponseBody等多种形式.⽅式⼀提到ExceptionHandlerExceptionResolver不仅维护@Controller级别的@ExceptionHandler,同时还维护的@ControllerAdvice级别的@ExceptionHandler.代码⽚段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#getExceptionHandlerMethodisApplicableToBeanType⽅法是⽤来做条件判断的,@ControllerAdvice注解有很多属性⽤来设置条件,basePackageClasses、assignableTypes、annotations等,⽐如我限定了annotations为注解X,那标注了@X 的ControllerA就可以⾛这个异常处理器,ControllerB就不能⾛这个异常处理器.现在问题的关键就只剩下了exceptionHandlerAdviceCache是什么时候扫描@ControllerAdvice的,下⾯的逻辑和@ExceptionHandler的逻辑⼀样了.exceptionHandlerAdviceCache初始化逻辑:代码⽚段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#afterPropertiesSetafterPropertiesSet是Spring bean创建过程中⼀个重要环节.代码⽚段位于:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#initExceptionHandlerAdviceCacheControllerAdviceBean.findAnnotatedBeans⽅法查找了SpringMvc⽗⼦容器中标注 @ControllerAdvice 的bean, new ExceptionHandlerMethodResolver初始化时候解析了当前的@ControllerAdvice的bean的@ExceptionHandler,加⼊到ExceptionHandlerExceptionResolver的exceptionHandlerAdviceCache中,key为ControllerAdviceBean,value为ExceptionHandlerMethodResolver . 到这⾥exceptionHandlerAdviceCache就初始化完毕.查找SpringMvc⽗⼦容器中所有@ControllerAdivce的bean的⽅法代码⽚段位于:org.springframework.web.method.ControllerAdviceBean#findAnnotatedBeans遍历了SpringMVC⽗⼦容器中所有的bean,标注ControllerAdvice注解的bean加⼊集合返回.四.⽐较说明.@Controller+@ExceptionHandler、HandlerExceptionResolver接⼝形式、@ControllerAdvice+@ExceptionHandler优缺点说明:在Spring4.3.0版本下,1.优先级来说,@Controller+@ExceptionHandler优先级最⾼,其次是@ControllerAdvice+@ExceptionHandler,最后才是HandlerExceptionResolver,说明假设三种⽅式并存的情况优先级越⾼的越先选择,⽽且被⼀个捕获处理了就不去执⾏其他的.2. 三种⽅式都⽀持多种返回类型,@Controller+@ExceptionHandler、@ControllerAdvice+@ExceptionHandler可以使⽤Spring⽀持的@ResponseBody、ResponseEntity,⽽HandlerExceptionResolver⽅法声明返回值类型只能是 ModelAndView,如果需要返回JSON、xml等需要⾃⼰实现.3.缓存利⽤,@Controller+@ExceptionHandler的缓存信息在ExceptionHandlerExceptionResolver的exceptionHandlerCache,@ControllerAdvice+@ExceptionHandler的缓存信息在ExceptionHandlerExceptionResolver的exceptionHandlerAdviceCache中, ⽽HandlerExceptionResolver接⼝是不做缓存的,在前⾯两种⽅式都fail的情况下才会⾛⾃⼰的HandlerExceptionResolver实现类,多少有点性能损耗.。

异常处理规范.doc

异常处理规范.doc

异常处理规范目录1.目标 (2)2.异常的分类 (2)3.框架异常处理模型 (3)4.定义异常 (3)5.抛出异常 (4)6.捕捉异常 (5)7. 处理异常 (6)8.方法覆盖 (8)9.服务端/客户端异常 (8)1.目标本文旨在介绍NCV5环境下,采用中间件抽象框架提供的开发模型,对异常定义、使用和捕捉等的处理规范。

2.异常的分类从异常(错误)的紧要程度和通常反应的处理逻辑来讲,程序员所要关心的异常主要有四类:JVM错误:这种类型的错误由 JVM 抛出。

OutOfMemoryError 就是 JVM 异常的一个常见示例。

对 JVM 异常您无能为力。

它们表明一种致命的情况。

唯一得体的退出办法是停止应用程序服务器(可能要增加硬件资源),然后重新启动系统。

非JVM错误(Error):表示对整个系统的处理具有严重影响的错误,如cache溢出,中间件框架启动失败等等。

这类异常一般需要中间件方面的参数调整或者重新启动系统。

非受查异常:在大多数情况下非受查异常由 JVM 作为 RuntimeException 的子类抛出。

例如,NullPointerException 或 ArrayOutOfBoundsException 将因代码中的错误而被抛出。

另一种类型的非受查异常在系统碰到配置不当的资源时发生,在这种情况下,系统不能进行合适处理,因此作为非受查异常抛出颇有意义。

还有的规则是,如果您对某个异常无能为力,那么它应当重新封装为非受查异常抛出。

受查异常:受查异常是一种定制异常,由应用程序或第三方的库抛出,它们预示了处理逻辑中的某个条件尚未满足。

从中间件抽象框架和程序员使用的角度来看,程序员主要关心两类异常,一类为系统异常,一类为应用程序异常,这两类异常在中间件抽象框架和业务方法中都可能遇到,并且处理,因此我们对他们进行更加详细地说明:中间件框架非受查异常:这类异常来自于FrameworkRuntimeException,对于这类异常程序员通常不需要特别的逻辑处理,需要通过配置中间件和框架进行解决 业务模块的非受查异常:业务处理模块如果对于一些处理上的逻辑没有处理能力,需要抛出业务模块的系统异常,该类异常来自BusinessRuntinmeException 中间件抽象框架受查异常:这类异常来自于FrameworkException,业务模块通常需要捕作他们处理,或者重新封装为业务模块的非受查异常,或者进行适当的处理,然后封装作为业务模块的受查异常抛出,或者完全处理恢复。

异常处理结构

异常处理结构

异常处理结构
异常处理结构是一种程序设计结构,用于在程序运行过程中捕捉和处理异常情况。

异常处理结构通常包括以下几个部分:
1. try块:在try块中编写可能引发异常的代码。

如果在try块中引发了异常,那么该块后面的代码将不再执行,而是转到异常处理块。

2. except块:在except块中编写处理异常的代码。

当try块中的代码引发异常时,异常会被传递到except块中,然后在该块中进行处理。

一个try块可以对应多个except块,用于处理不同类型的异常。

3. finally块:在finally块中编写不管是否发生异常都需要执行的代码。

finally块中的代码会在try块和except块执行完毕后执行,并且无论是否发生异常都会执行。

4. raise语句:在代码中使用raise语句可以手动引发异常。

可以使用raise语句来主动触发异常,然后在except块中捕获并处理该异常。

异常处理结构能够有效地处理程序运行过程中可能出现的异常情况,提高程序的健壮性和稳定性。

通过合理使用异常处理结构,可以在程序出现异常时及时处理和恢复,以保证程序的正常运行。

软件开发中的异常处理和调试技巧

软件开发中的异常处理和调试技巧

软件开发中的异常处理和调试技巧在软件开发中,异常处理和调试技巧可以说是非常重要的一环。

当软件出现异常时,如果不及时处理,很可能会导致软件崩溃甚至造成系统崩溃,影响用户体验。

因此,开发人员需要对异常进行及时、准确的定位和处理,以确保软件的稳定性和可靠性。

本文将介绍一些在软件开发中常用的异常处理和调试技巧,希望能对开发人员有所帮助。

一、异常处理1.try-catch语句try-catch语句是Java编程语言中处理异常的一种基本机制。

在try块中,放置可能会引发异常的代码段,当try块中的代码引发异常时,程序跳转到catch块,其中的代码处理异常。

catch块可以有多个,用来处理不同类型的异常,从而保证程序出现异常时能够及时捕获并处理。

同时,在finally块中可以放置无论是否出现异常都需要执行的代码,如释放资源等。

2.日志功能日志功能一般用来记录程序在执行过程中遇到的异常信息,以便于开发人员及时发现和处理异常。

在Java中,常用的日志工具有Log4j、SLF4J等。

通过配置和使用这些工具,可以将程序中遇到的异常信息输出到日志文件中,便于开发人员定位和处理问题。

3.异常处理框架异常处理框架是一种通用的异常处理机制,可以与多种编程语言集成使用。

常见的异常处理框架有Spring和Hibernate等。

这些框架可以处理不同层级的异常,从而减少编写异常处理代码的麻烦。

二、调试技巧1.断点调试断点调试是一种常用的辅助调试技巧,通常在程序中添加断点,使程序执行到断点处暂停,以便于开发人员查看当前程序状态。

在Java中,常见的IDE(集成开发环境)如Eclipse和IntelliJIDEA等都提供了断点调试功能。

通过该功能,开发人员可以逐步执行程序,查看程序执行状态、变量的值等信息,从而定位问题。

2.日志调试除了记录异常信息外,日志还可以用来调试程序。

在开发过程中,开发人员可以在程序内部输出一些详细的运行信息到日志文件中,以便于发现问题。

异常处理机制及流程

异常处理机制及流程

异常处理机制及流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 异常的定义异常是指在程序运行过程中发生的错误或异常情况,例如除数为 0、数组越界、文件不存在等。

在线考试系统异常处理框架的设计与实现

在线考试系统异常处理框架的设计与实现

在线考试系统异常处理框架的设计与实现
张太芳
【期刊名称】《兰州工业学院学报》
【年(卷),期】2008(015)003
【摘要】异常处理是Java语言的重要语言机制,正确地处理异常对程序的可靠性、健壮性是十分重要的.对分布式的多层混合模型的在线考试系统可能存在的多种潜
在异常,设计并实现了异常处理框架TSEHF(Test System Exception Handling Framework).
【总页数】3页(P31-33)
【作者】张太芳
【作者单位】兰州石化职业技术学院,信息处理与控制工程系,甘肃,兰州,730060【正文语种】中文
【中图分类】TP312;IA
【相关文献】
1.基于.NET框架下在线考试系统的设计与实现 [J], 李涛;秦卫平;黄浩军
2.基于MVC框架在线考试系统的设计与实现 [J], 朱运乔
3.基于SSH框架的在线考试系统的设计与实现 [J], 植雅芳
4.在线考试系统设计与实现——以市政设计院考试系统为例 [J], 吴迪
5.Struts与Hibernate框架下在线考试系统的设计与实现 [J], 林志灿
因版权原因,仅展示原文概要,查看原文内容请购买。

异常处理机制范文

异常处理机制范文

异常处理机制范文异常处理机制是指在程序运行过程中,当出现错误或异常情况时,通过捕获和处理异常来保证程序的正常执行。

异常可以是程序自身内部错误,也可以是外部环境和资源导致的错误。

异常处理机制的目的是让程序在出现异常时能够给出相应的处理方式,使程序具备一定的容错性和鲁棒性。

异常处理机制的基本流程包括抛出异常和捕获异常两个步骤。

当在程序中发生异常时,系统会创建一个异常对象,并将该异常对象抛出。

异常对象携带了异常发生时的具体信息,比如异常类型、异常消息、异常发生的位置等。

程序会按照顺序查找异常处理代码,直到找到合适的异常处理代码来捕获并处理该异常。

异常处理代码可以包括try-catch语句块、try-finally语句块和try-with-resources语句块等。

1.提高程序的可靠性和容错性:通过异常处理,程序可以在出现异常时提供相应的处理方式,避免程序因为异常而终止执行,使程序更具弹性和健壮性。

2.简化代码结构:异常处理机制可以将错误处理代码统一集中处理,简化了程序的结构和逻辑,提高了代码的可读性和维护性。

3.提供良好的错误信息:异常处理机制会生成异常对象,其中携带了异常发生的具体信息,包括异常类型、异常消息、异常发生的位置等,能够帮助程序员更快地定位和修复错误。

在Java中,异常分为两类:受检异常(checked exception)和非受检异常(unchecked exception)。

受检异常是指需要在代码中显式捕获和处理的异常,比如IOException、SQLException等。

非受检异常是指不需要在代码中显示捕获和处理的异常,比如NullPointerExceptio、ArithmeticException等。

1. 使用try-catch语句块捕获异常:通过try-catch语句块可以捕获指定类型的异常,并提供相应的处理逻辑。

catch语句块中可以有多个catch语句,分别捕获不同类型的异常,也可以使用多个catch语句来捕获同一类型的异常,处理逻辑由程序员自行决定。

异常处理基本流程七步

异常处理基本流程七步

异常处理基本流程七步第一步:捕获异常异常处理的第一步是捕获异常。

当我们预料到某一段代码可能会抛出异常时,我们可以使用try语句来捕获这个异常。

在try语句中的代码块中执行可能会出现异常的代码,一旦抛出异常,会跳转到except语句块中进行处理。

第二步:处理异常在except语句块中,我们可以对捕获到的异常进行处理。

我们可以根据不同的异常类型,进行相应的处理。

比如可以输出异常信息、记录日志、返回特定的值等。

在处理异常的过程中,我们可以选择让程序继续执行或者终止程序。

第三步:抛出异常有时候,在处理异常时,我们可能并不知道如何处理这个异常,或者希望让调用者来处理这个异常。

这时候可以使用raise语句来手动抛出异常。

通过raise语句,我们可以显示地抛出异常,并将异常传递给调用者。

第四步:清理操作在异常处理之后,我们有时候需要进行一些清理操作。

比如关闭文件、释放资源、恢复状态等。

为了确保程序的稳定性,我们应该在finally语句块中执行这些清理操作。

finally语句块中的代码会在try语句块中的代码执行完毕之后无论是否发生异常都会执行。

第五步:自定义异常除了使用系统定义的异常类型外,我们还可以自定义异常类型。

通过自定义异常类型,我们可以更好地组织和管理异常情况。

通常我们可以通过定义一个类,并继承自Exception类来创建自定义异常类型。

在程序中抛出自定义异常,可以使代码更加条理清晰。

第六步:异常链在进行异常处理时,有时候一个异常会引发另一个异常,这种情况称为异常链。

为了更好地处理异常链,我们可以使用raise语句来将一个异常传递给另一个异常。

通过这种方式,可以很容易地追踪异常的传递过程,更好地定位问题所在。

第七步:记录日志在程序中良好的记录日志是非常有必要的。

通过记录日志,我们可以更好地追踪程序运行的过程,了解程序中可能存在的异常情况。

在异常处理时,输出异常信息到日志中,可以帮助我们更好地定位、分析问题,并进行及时的处理。

一种Java异常处理框架的设计与实现

一种Java异常处理框架的设计与实现
域 的软件复 用。 基于 以上异 常处 理 中的 问题和 使 用框架 的益 处 , 建立异常处理框架。
图 1 框 架结 构
( )Xv 解析器用来对 Xv 配置文件的进行解析。 4 』 l L 』L l
( )异 常处 理辅 助 器 用来 获取 实 际 的异 常 处理 5
器。
2 异 常处 理框架的设计与实现
c p in> et o
该异常型 别相 对 应 的异 常处 理 器 , 后通 过 Jv 然 aa的 Rf do ( ee in 映像 ) l 机制 , 用异 常处理器 的处理方法 。 调
2 3 核心 接 口和 类的设 计 . 在 Jv aa编程 中 , v J a的接 口为 构建可重 用的系统 a
提供 了很 大的支 持 , 因而 为 了使框 架得到 最大程 度 的
< h n lr> c m . c p in a dig D f u E - a de a e e t h n l . a ix x o n e t H n lr h n lr a de </ a de >
</t m > i e
2 1 异常处理框架 的结构 .
框 架的结构如图 1 所示 。 该框架分 成 5大块 。 ( )异 常类封装 了一 个特定 的错误 。 1 ( )异常处理 器封 装 了异 常处 理方 法 , 中含有 2 其

22 异 常处理框架 的处理流程 .
在异 常处理 辅助器 中, 先产 生一个 X I 解析 器 实 NL 例, 通过该 实例把 X 配 置文件 中的异 常类和 对应 的 ML
杨龙飞 李 华 ( 电技术 与智能控制教育部重点实验 室( 光 兰州交通大 学) 甘 肃兰州 7 0 7 ) 3 0 0
摘要 : 目前 Jv 对 a a异常处理 中所存在 的问题进行 了分析 , 出了一种具有 可扩充性和 重用性 的异 常处理框 架 , 提 该

MyBatis框架之异常处理

MyBatis框架之异常处理

MyBatis框架之异常处理 MyBatis框架定义了许多的异常类,之所以定义这么多的异常类,应该是将每⼀种异常情况都独⽴出来,这样在出现异常时,定位就很明确了。

⽽我们平时写代码时,都是瞎搞⼀通,异常类⼤多也是随便定义,或者是使⽤JDK⾃带异常类,有时候甚⾄是直接弄Exception。

缺点显⽽易见了。

今后写代码,也应该是学着MyBatis,将每种业务(或场景)可能出现的异常进⾏单独封装,这样,当项⽬报错,出现异常时,定位起来也就简单很多。

MyBatis的异常爹是IbatisException.class ,⽽它⼜是RuntimeException的⼉⼦。

这是为什么呢? 1. Exception异常,要么抛,要么处理。

强制性要求。

2. RuntimeException异常,编译时我也不知道会不会出错,运⾏时才知道结果咋样,,,,可以不处理,但是出错了,程序就停摆。

具体啥原因,我也不知道,但是⼈家MyBatis都是这样搞,那我们以后写代码也跟着这样弄吧public class IbatisException extends RuntimeException {private static final long serialVersionUID = 3880206998166270511L;public IbatisException() {super();}public IbatisException(String message) {super(message);}public IbatisException(String message, Throwable cause) {super(message, cause);}public IbatisException(Throwable cause) {super(cause);}} MyBatis异常爹就是这样定义的,提供了4个结构函数,构造函数全是super, ⽽且它所有的异常⼦类,似乎也都是这种款式。

异常处理方法及流程

异常处理方法及流程

异常处理方法及流程异常处理是指在程序运行过程中,处理可能出现的错误或异常情况的一种程序设计模式。

异常处理的目的是保证程序能够正常运行,避免程序崩溃或产生不可预料的结果。

本文将介绍一种常见的异常处理方法及流程。

异常处理方法及流程主要包括以下几个步骤:1. 检测异常:在程序中添加适当的代码来检测可能发生的异常。

这可以通过使用try语句块来实现。

try语句块包含可能引发异常的代码段。

2. 异常处理:当异常被引发时,可以通过使用catch块来处理异常。

catch块包含用于处理异常的代码段。

在catch块中,可以编写适当的代码来处理异常情况,比如打印错误信息、记录日志、回滚事务等。

3. 异常类型匹配:catch块中可以指定处理特定类型的异常。

在Java中,可以使用多个catch块来处理不同类型的异常。

异常类型匹配是根据异常类型来确定哪个catch块将被执行。

4. finally块:finally块是一个可选的代码块,用于定义在任何情况下都将执行的代码。

无论是否发生异常,finally块中的代码都会被执行。

通常在finally块中释放资源,比如关闭文件、数据库连接等。

下面是一个简单的示例:```try{// 可能引发异常的代码int result = 10 / 0;} catch(ArithmeticException e){// 处理特定类型的异常System.out.println("除数不能为零");e.printStackTrace();} catch(Exception e){// 处理其他类型的异常System.out.println("发生了未知异常");e.printStackTrace();} finally{// 释放资源或执行必要的清理操作System.out.println("执行finally块");}```在上述示例中,try块中的代码会引发一个ArithmeticException 异常,因为除数为零。

异常处理方法及流程

异常处理方法及流程

异常处理方法及流程异常处理是软件开发中非常重要的一环,它涉及到程序在运行过程中出现的各种异常情况的处理方法和流程。

在实际的开发过程中,我们经常会遇到各种异常,如空指针异常、数组越界异常、数据库连接异常等,如何有效地处理这些异常,保证程序的稳定性和可靠性,是我们需要认真思考和解决的问题。

首先,我们需要对可能出现的异常情况进行充分的分析和预测,这样才能更好地制定出合理的异常处理方法和流程。

在编写代码的过程中,我们需要考虑到各种可能的异常情况,并在相应的地方添加异常处理的代码,以保证程序在出现异常时能够正确地进行处理。

其次,我们需要针对不同的异常情况,制定出相应的异常处理方法和流程。

对于一些可以预测并且可以通过程序代码避免的异常,我们可以在程序中添加相应的判断和处理逻辑,以尽量避免出现异常情况;对于一些不可避免的异常,我们需要编写相应的异常处理代码,以保证程序在出现异常时能够正确地进行处理,并且不会对整个系统造成影响。

另外,我们还需要考虑异常处理的效率和性能。

在设计异常处理方法和流程时,我们需要尽量避免使用过多的资源和时间,以免影响程序的性能和效率。

同时,我们还需要考虑异常处理的优先级,对于一些严重的异常情况,我们需要尽快进行处理,以避免对系统造成更大的影响。

最后,我们需要对异常处理方法和流程进行充分的测试和验证。

在开发过程中,我们需要对异常处理的代码进行充分的测试,以确保它能够正确地处理各种异常情况,并且不会引入新的问题。

同时,我们还需要对异常处理方法和流程进行充分的验证,以确保它能够满足程序的实际需求,并且能够在各种复杂的情况下正确地进行处理。

总之,异常处理是软件开发中非常重要的一环,它涉及到程序在运行过程中出现的各种异常情况的处理方法和流程。

在实际的开发过程中,我们需要充分分析和预测可能出现的异常情况,并制定出相应的异常处理方法和流程,以保证程序的稳定性和可靠性。

同时,我们还需要考虑异常处理的效率和性能,并对异常处理方法和流程进行充分的测试和验证,以确保它能够满足程序的实际需求。

异常处理规范范本

异常处理规范范本

异常处理规范范本一、引言在软件开发和系统运维中,异常是不可避免的。

良好的异常处理规范能够帮助开发人员和运维人员高效、准确地定位和解决异常情况,保证系统的可靠性和稳定性。

本文旨在提供一个异常处理规范范本,为开发和运维团队提供参考,以确保在应对异常情况时能够采取一致的、合理的处理方式。

二、异常分类异常情况可以根据其来源和性质进行分类。

根据来源,可以将异常分为预期异常和非预期异常;根据性质,可以将异常分为逻辑异常和技术异常。

在处理异常时,需要根据具体情况选择相应的处理方式。

1. 预期异常预期异常是在开发过程中能够事先预见并合理处理的异常情况。

这些异常通常是由于用户输入错误、外部依赖的变化等原因引起的。

对于预期异常,应尽量通过用户友好的提示信息引导用户修正错误或采取必要的补救措施。

2. 非预期异常非预期异常是在运行过程中出现的意外情况,无法事先预见并处理的异常。

这些异常通常是由于编程错误、硬件故障、网络异常等原因引起的。

对于非预期异常,应及时记录异常信息,并根据操作手册或应急预案进行恢复操作或报告。

3. 逻辑异常逻辑异常是指程序在执行过程中发生的不符合预期的错误。

这些异常可能是由于错误的业务逻辑、错误的数据处理等引起的。

在处理逻辑异常时,应通过日志记录、错误码等方式快速定位异常原因,并进行适当的补救措施。

4. 技术异常技术异常是指软件或系统在运行过程中出现的技术性故障。

这些异常可能是由于网络中断、数据库连接失败、硬件故障等引起的。

在处理技术异常时,应首先排除外部依赖的故障,如网络、数据库等,然后根据错误日志或监控信息定位异常原因,并采取相应的修复措施。

三、异常处理流程良好的异常处理流程是保证系统可靠性的重要保障。

以下是一个示例的异常处理流程,供参考:1. 捕获异常开发人员应在程序中的关键位置捕获异常,避免异常的传递导致系统崩溃或运行不稳定。

捕获异常时,要确保异常信息能够被完整记录,以便后续分析和定位。

2. 记录异常信息在捕获异常后,应及时记录异常信息,包括异常类型、发生时间、异常栈等,以便后续分析和定位异常原因。

异常处理流程数据表结构设计

异常处理流程数据表结构设计

异常处理流程数据表结构设计引言:在软件开发过程中,异常处理是一个非常重要的环节。

当程序运行过程中遇到异常情况时,需要进行相应的处理,以保证程序的稳定性和可靠性。

为了规范异常处理流程,可以设计一张异常处理流程数据表,用于记录异常的类型、处理方式等信息。

本文将详细介绍异常处理流程数据表的结构设计。

一、异常处理流程数据表的基本信息异常处理流程数据表是一个包含多个字段的表格,用于记录异常处理的相关信息。

下面是异常处理流程数据表的基本字段:1. 异常类型(ExceptionType):用于描述异常的类型,如空指针异常、文件读取异常等。

2. 异常描述(ExceptionDescription):对异常进行详细的描述,包括异常产生的原因、影响以及可能的解决方案等。

3. 异常处理方式(HandlingMethod):记录对异常的处理方式,如捕获并记录日志、抛出异常等。

4. 异常处理代码示例(CodeExample):提供异常处理的代码示例,便于开发人员参考和使用。

5. 异常处理结果(HandlingResult):记录异常处理的结果,如成功处理、处理失败等。

6. 异常处理时间(HandlingTime):记录异常处理的时间,便于追溯和统计。

7. 异常处理人员(Handler):记录负责处理异常的人员信息,便于沟通和协作。

8. 异常处理备注(Remark):可选字段,用于记录其他与异常处理相关的信息。

二、异常处理流程数据表的设计思路异常处理流程数据表的设计需要考虑以下几个方面:1. 异常分类:根据实际需求,将异常进行分类,以便更好地管理和处理。

可以按照异常的来源、影响范围等进行分类。

2. 异常描述:对每个异常进行详细的描述,包括异常的原因、产生的条件、可能的解决方案等。

描述要准确清晰,避免歧义或错误信息。

3. 异常处理方式:根据异常的类型和严重程度,确定相应的处理方式。

可以采用捕获并记录日志、抛出异常、重试等方式进行处理。

系统异常处理机制

系统异常处理机制

系统异常处理机制系统异常处理机制是指在软件开发中,为了应对系统运行过程中可能出现的各种异常情况,而设计的一套处理流程和机制。

异常是指在系统运行过程中发生的、不符合预期的事件或错误,这些异常可能是因为错误的用户输入、系统资源不足、网络故障、硬件故障等原因引起的。

异常处理机制的设计可以提高系统的稳定性和可靠性,有效地避免程序崩溃和数据丢失。

下面是一些相关参考内容,供大家参考和学习。

1. 异常处理原则:- 高内聚低耦合原则:将异常的捕获和处理放在尽可能接近产生异常的地方,减少代码的侵入性,降低模块间的耦合度。

- 提供友好的错误提示:向用户提供明确的错误提示信息,让用户能够理解和解决问题。

2. 异常处理流程:- 异常抛出:在需要处理异常的代码块中,通过throw关键字抛出异常对象。

- 异常捕获:在上层代码中使用try-catch语句块来捕获异常。

catch块中的代码会处理异常,并可以抛出新的异常。

- 异常处理:在catch块中,使用合适的日志记录、错误处理、资源释放等方式来处理异常。

3. 异常分类:- 可查异常(Checked Exceptions):在编译期间必须进行处理的异常,比如IOException、SQLException等。

通常需要使用try-catch语句块来捕获和处理这些异常。

- 运行时异常(Runtime Exceptions):不需要在编译期间指定捕获的异常,比如NullPointerException、ArrayIndexOutOfBoundsException等。

通常是由于程序逻辑错误或数据错误引起的,应该避免出现此类异常。

4. 异常处理策略:- 异常日志记录:将异常信息写入日志文件,便于分析和排查问题。

- 异常回滚:当异常发生时,将系统恢复到异常发生之前的状态,避免数据的不一致性。

- 重试机制:对于可恢复的异常,可以进行自动重试操作,直到达到重试次数限制。

- 容错操作:通过提供默认值、忽略错误、降级处理等方式,对错误进行容错,保证系统的可用性。

异常处理的方法及步骤

异常处理的方法及步骤

异常处理的方法及步骤引言:在编程过程中,我们经常会遇到各种各样的异常情况。

为了保证程序的稳定性和可靠性,我们需要对这些异常情况进行处理。

异常处理是指程序在运行过程中遇到错误或异常情况时,能够做出相应的处理措施,以保证程序的正常运行。

本文将介绍异常处理的方法及步骤,帮助读者更好地理解和应用异常处理的技术。

一、异常处理的方法1. try-catch块:try-catch块是最基本的异常处理方法。

它的结构如下:```try {// 可能会产生异常的代码} catch (Exception e) {// 异常处理代码}```在try块中,我们放置可能会产生异常的代码。

当这些代码运行时,如果产生了异常,程序会立即跳转到catch块,并执行catch块中的代码,以处理异常。

catch块中的Exception e是用来接收异常信息的变量,我们可以通过这个变量来获取异常的相关信息,并做出相应的处理。

2. 多个catch块:有时候,我们可能会遇到多种类型的异常,每种异常需要做出不同的处理。

这时,我们可以使用多个catch块来分别处理不同类型的异常,如下所示:```try {// 可能会产生异常的代码} catch (ExceptionType1 e1) {// 异常处理代码1} catch (ExceptionType2 e2) {// 异常处理代码2}```在多个catch块中,我们可以根据具体的异常类型来编写不同的处理代码。

当产生异常时,程序会根据异常类型的匹配情况,选择相应的catch块来执行。

3. finally块:有时候,我们希望无论是否发生异常,都能执行一些必要的代码,比如释放资源等。

这时,我们可以使用finally块来实现这个需求,如下所示:```try {// 可能会产生异常的代码} catch (Exception e) {// 异常处理代码} finally {// 必要的代码}```在finally块中的代码,无论是否发生异常,都会被执行。

前端框架技术中的错误处理与异常处理方法

前端框架技术中的错误处理与异常处理方法

前端框架技术中的错误处理与异常处理方法在前端开发中,错误处理与异常处理是非常重要的一环。

当用户在使用网站或应用程序时遇到错误或异常情况时,良好的错误处理与异常处理机制能够提供用户友好的提示,并协助开发人员定位和解决问题。

本文将探讨前端框架技术中常用的错误处理与异常处理方法。

1. 错误处理与异常处理的概念错误处理是指当程序代码执行过程中遇到错误时,如未定义的变量、语法错误等,程序会抛出异常并终止执行。

良好的错误处理机制能够捕获这些错误,并提供有助于调试和修复问题的错误信息。

而异常处理是指当程序运行过程中遇到意外的情况,如网络请求失败、用户输入不合法等,通过设置异常处理机制能够避免程序崩溃,并提供用户友好的提示信息。

2. 前端框架中常见的错误处理方法2.1. try-catch块try-catch块是JavaScript中常见的错误处理机制之一。

通过在代码中使用try关键字将可能抛出异常的代码包裹起来,然后使用catch关键字来捕获并处理异常。

在catch块中,我们可以通过打印错误信息、记录日志或者向用户显示错误提示来处理异常情况。

例如,在Vue.js中,可以在组件的生命周期钩子函数中使用try-catch块来处理异常情况,如:```javascriptexport default {mounted() {try {// 可能抛出异常的代码// ...} catch (error) {// 处理异常console.error(error);// 显示错误提示给用户this.$message.error('发生错误,请联系管理员!');}}}```2.2. Promise的错误处理在使用Promise进行异步编程时,可以通过catch方法捕获异常并进行处理。

通过在Promise链式调用中添加catch方法,可以处理前面代码中抛出的错误,避免程序崩溃,并提供错误处理的机制。

例如,在使用axios进行网络请求时,在then方法链中添加catch方法来处理异常情况:```javascriptaxios.get('/api/user').then(response => {// 处理响应数据console.log(response);}).catch(error => {// 处理异常console.error(error);// 显示错误提示给用户this.$message.error('网络请求失败,请稍后再试!');});```2.3. 错误边界(Error boundaries)错误边界是React框架中引入的一个概念,用于处理组件内部发生的错误。

flask的异常处理机制

flask的异常处理机制

flask的异常处理机制Flask是一个使用Python编写的轻量级Web应用框架,它提供了一套简单而灵活的异常处理机制。

在Flask中,你可以通过自定义错误处理函数来处理不同类型的异常。

以下是Flask 中异常处理的一般机制:1. 内建异常处理器:Flask内建了一些常见的HTTP错误处理器,例如`404 Not Found`、`500 Internal Server Error`等。

你可以使用`@app.errorhandler`装饰器来注册这些内建的错误处理函数。

```pythonfrom flask import Flask, render_templateapp = Flask(__name__)@app.route('/page_not_found')def page_not_found():return render_template('404.html'), 404@app.route('/internal_server_error')def internal_server_error():return render_template('500.html'), 500```2. 自定义异常处理器:你可以通过`@app.errorhandler`装饰器自定义异常处理函数,处理你的应用中可能发生的异常。

```pythonfrom flask import Flask, render_templateapp = Flask(__name__)@app.errorhandler(404)def page_not_found(error):return render_template('404.html'), 404@app.errorhandler(500)def internal_server_error(error):return render_template('500.html'), 500```3. 全局异常处理器:你还可以通过`@app.errorhandler(Exception)`装饰器定义一个处理所有异常的全局异常处理函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通用异常处理框架
通用异常处理框架(转载)通用异常处理框架【摘要】异常捕捉、处理是每个项目中必不可少的一部分,利用反射和XML配置技术实现一个通用的、灵活的、可配置的、高度可自扩展的异常处理框架对项目的整体健壮性以及异常处理
效率都是非常重要的。

通用异常处理框架中需要提供配置信息的支持以及统一的异常处理类和异常日志记录类管理,并允许用户以插件形式扩展自定义的异常处理或日志记录方式。

一、问题的提出由于异常处理在项目中的普遍性,我们会很自然的想到是否可以对异常处理模块进行提取为
公用模块,加强项目间的复用,提高项目的开发进度。

并且在异常处理中,因为没有良好的异常处理系统可能造成一些问题:l 若异常处理方式不当,容易造成比较严重的性能问题。

l 在项目开发阶段,开发人员需要得到完整的异常错误信息方便分析BUG;在项目发布阶段,用户希望看到的是比较友好的错误信息。

一个良好的异常处理系统应能够通过简单的配置方便的达到这样的效果l
异常处理系统应该能够提供足够的信息方便开发人员对BUG异常的准确定位,减少查找BUG产生原因的时间。

(该问题在自己的项目中有过深刻教训:因项目中异常信息的不准确,导致一个BUG消耗大量人力时间)l 一个项
目中各层对异常处理的方式不同,可能会不同的层编写不同的代码,造成代码使用麻烦以及复用性低,若需修改,可能改动较大。

(例如PDM项目中,除UI层外,都是对异常进行包装后抛给上一层捕捉;而UI层需要处理记录异常,并反馈给用户;即便是UI层也应WebUI和WinUI采用的不同的方式实现,提供给项目的接口也都有一定区别,增加了编码的复杂程度)l 异常报告信息没有统一管理。

很多项目中报告给用户的错误消息,都是程序员在开发中自己编写的,对用户而言,常常不是有效的友好的提示信息。

集中管理后可以由BA来进行错误信息的整理,改善用户体验。

l 异常记录方式可能会在不同环境有不同的处理,应该能通过配置文件简单的实现,而不必每次为不同的应用编写代码。

l 要把异常系统做成一个通用的框架,存在一个比较大的挑战:不同的项目可能因项目的整体构架不同,对异常处理方式会有不同的需求,如何保持通用异常处理框架的灵活性的同时实现复用以及可配置性。

二、解决思路为了最大程度实现异常处理框架的通用性、可扩展性以及可配置性,采用配置文件结合动态加载插件的方式:框架提供接口,由不同项目根据自己的需要实现接口,完成对异常的处理,以及异常日志的记录;而框架再根据配置信息决定异常处理在不同的情况下的处理策略,并通过调用用户实现的接口来完成异常处理过程。

整个异常处理过程
对项目调用高度封装,项目中不论任何地方,只需调用一个唯一的接口,框架就会根据配置信息执行需要的异常处理。

三、实践情况整体结构框架主要由ExManagement.Config、ExManagement.Interface、
ExManagement.MessageHandler以及ExManagement构成。

如图:三-1 u ExManagement.Config:用于从配置文件中获取配置信息,并将配置信息转换为一个配置信息实体对象,提供给框架的其他部分使用。

u ExManagement.Interface:提供异常处理类、异常日志记录类以及异常错误报告类的接口和基类,便于用户在框架的基础上进行自定义的扩展u
ExManagement.MessageHandler:对
ExManagement.Interface中的IMessage接口实现,提供了WebUI和WinUI下的弹出错误信息提示的支持。

也可以直接编写一个满足IMessage接口的包,以自己需要的方式弹出错误提示信息。

u ExManagement:是控制和管理框架按照配置信息进行处理的控制类。

首先根据异常处理配置加载需要的异常处理类和日志记录类,再按照配置信息内容对异常进行处理。

并提供唯一的接口供项目调用。

u ExManagement.Handler:默认的异常处理包,包含了一种对异常处理的具体实现。

用户也可以继承ExManagement.Interface中的ExHandlerBase基类,实现
自定义的异常处理类,并通过修改配置文件让框架调用。

u ExManagement.LogHandler:默认日志记录包,包含一种将异常日志记录到数据库的具体实现。

用户也可以实现ExManagement.Interface中的ILogHandler接口,实现自定义的异常处理类,并通过修改配置文件让框架调用。

图三-1ExManagement.Config包该包主要由两部分组成:实现System.Configuration.IConfigurationSectionHandler
接口的ExSectionHandler类和配置信息实体类ExManagerConfig。

如图三-2。

ExManagerConfig 类中又定义了3个嵌入类:ExHandlerConfig、LogHandlerConfig、LogHandlerConfigCollection以及三个枚举ExAlertType、ErrorCodeSource、ExReturnMode。

ExManagerConfig、ExHandlerConfig、LogHandlerConfig 分别对应配置文件中的、、节点。

ExManagerConfig是一个集合类,从System.Collections.CollectionBase继承,包含若干个ExHandlerConfig对象,并通过索引器访问包含的ExHandlerConfig对象,支持以int和string两种方式索引。

ExHandlerConfig中除了包含对应节的属性外,还包含一个LogHandlerConfigCollection对象,是LogHandler类的集合类。

图三-2 ExSectionHandler类从配置文件中按照固定的格式获取到相应的配置信息,并将信息填充到ExManagerConfig。

配置文件&lt;configuration&gt; &lt;configSections&gt; &lt;section name="ExManager"
type="ExManagement.Config.ExSectionHandler, ExManagement.Config" /&gt; &lt;
SPAN&gt;configSections&gt; &lt;ExManager ErrorCodeSource="XML/DB" ConnectionString="" DataTable=""&gt; &lt;ExHandler Name=""
Type="" ReturnMode=""
AlertType="WebUI/WinUI/None"/&gt;
&lt;ExHandler Name="" Type="" ReturnMode="" AlertType=""&gt; &lt;LogHandler Type="" ConnectionString="" DataTable=""/&gt;
&lt;LogHandler Type="" ConnectionString=""
DataTable=""/&gt; &lt; SPAN&gt;ExHandler&gt; &lt; SPAN&gt;ExManager&gt;&lt;
SPAN&gt;configuration&gt;。

相关文档
最新文档