通用异常处理框架
- 格式:doc
- 大小:14.48 KB
- 文档页数:5
java异常处理机制
Java的异常处理是结构化编程的一个重要方面。
它提供了一种通用的方式来处理发生在应用程序或系统中的异常,比在代码中添加报错信息更有效。
Java异常处理模型包括异常类,异常处理器,throw和throws关键字以及堆栈跟踪。
异常类是Java的一种特殊类,它表示程序的异常状态(或者是错误情况)。
它从Java的Throwable类继承,Throwable类有两个子类,Exception和Error,它们派生出一组定义在Java中的异常。
异常处理器允许处理一个或多个特定类型的异常,是程序中处理异常的机制。
异常处理器通常作为程序的一部分,程序员可以通过编写异常处理器来为应用程序创建一个可以处理未知错误的安全环境。
Throw和throws关键字用于抛出异常。
Throw关键字用于将异常抛出到当前函数的调用点,throws关键字用于声明哪些异常可以被抛出,以便该方法的调用者可以捕获和处理它们。
堆栈跟踪是一种异常处理工具,可以展示异常期间应用程序运行的具体位置,同时可以追踪嵌套方法调用,并可以提供出现异常时的参数值,类型等等。
Java的异常处理机制为程序员提供了一种有效的处理在程序的运行过程中可能会发生的系统或应用程序异常的方法。
它可以保护应用程序免受非正常状况的危害,提高程序的安全性和效率。
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实现类,多少有点性能损耗.。
异常处理规范目录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语句来将一个异常传递给另一个异常。
通过这种方式,可以很容易地追踪异常的传递过程,更好地定位问题所在。
第七步:记录日志在程序中良好的记录日志是非常有必要的。
通过记录日志,我们可以更好地追踪程序运行的过程,了解程序中可能存在的异常情况。
在异常处理时,输出异常信息到日志中,可以帮助我们更好地定位、分析问题,并进行及时的处理。
通用异常处理框架
通用异常处理框架(转载)通用异常处理框架【摘要】异常捕捉、处理是每个项目中必不可少的一部分,利用反射和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。
配置文件<configuration> <configSections> <section name="ExManager"
type="ExManagement.Config.ExSectionHandler, ExManagement.Config" /> <
SPAN>configSections> <ExManager ErrorCodeSource="XML/DB" ConnectionString="" DataTable=""> <ExHandler Name=""
Type="" ReturnMode=""
AlertType="WebUI/WinUI/None"/>
<ExHandler Name="" Type="" ReturnMode="" AlertType=""> <LogHandler Type="" ConnectionString="" DataTable=""/>
<LogHandler Type="" ConnectionString=""
DataTable=""/> < SPAN>ExHandler> < SPAN>ExManager><
SPAN>configuration>。