亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

J2EE中的異常管理及錯誤跟蹤框架二(圖)

2019-11-18 12:27:04
字體:
來源:轉載
供稿:網友

  許多人認為SUN應該在每應用的基礎上給J2EE框架內置插入所有容器的鉤子。這樣就答應自定義錯誤處理方案、安全及更多可安裝的功能,而不需要依靠特定廠商的方案和框架。不幸地是,SUN并沒有在EJB規范中提供這樣的機制。既然如此,我們只有拿出AOP這個強有力的工具來增加異常處理。我們選擇的aspectWerkz框架,可以如下使用方面:
  
  public class EJBExceptionHandler implements AroundAdvice {PRivate ExceptionHandler handler;
  public EJBExceptionHandler() {   handler = ConfigHelper.getEJBExceptionHandler();
  }  public Object invoke(JoinPoint joinPoint) throws Throwable {   Log log = LogFactory.getLog(joinPoint.getEnclosingStaticJoinPoint().getClass().getName());
  log.debug("EJB Exception Handler bean context aspect!!");
  try {     return joinPoint.proceed();
  } catch (RuntimeException e) {     handler.handle(Thread.currentThread(), e);
  } catch (Error e) {     handler.handle(Thread.currentThread(), e);
  }   return null;
  }}
  
  實際的處理器是通過ConfigHelper類來配置和獲取的。假如RuntimeException 或者Error在業務邏輯處理過程被拋出時,處理器就會被請求處理了。
  
  DefaultEJBExceptionHandler序列化任何并非來自SUN核心包異常的堆棧信息到專門的SerializableException中,這從好的方面來看,可以將在遠程客戶端不存在的類的異常的堆棧以任意方式傳播,另一方面,這會丟失原始的異常。
  
  假如客戶端是遠程的,EJB容器忠實地捕捉RuntimeException或Error并將他包在java.rmi.RemoteException中,否則使用javax.ejb.EJBException。為了在最低程度保持來源的精確性及堆棧信息,框架在BusinessDelegates剝離傳送異常并重新拋出原始異常。
  
  Rampart框架的BusinessDelegate類提供一個EJB無關的接口給客戶端,而在內部包含本地或遠程的EJB接口。BusinessDelegate類從EJB實現類中用XDoclet生成的,他遵循圖4中UML圖結構:
  
 J2EE中的異常治理及錯誤跟蹤框架二(圖)(圖一)

  BusinessDelegate提供所有來自源EJB實現類的業務方法并代理給相應的LocalProxy或RemoteProxy類。在內部兩個代理類處理EJB相關的異常,從而隱藏了BusinessDelegate的實現細節。下面的代碼是來自某個LocalProxy類的方法:
  
  public java.lang.String someOtherMethod() {  try {   return serviceInterface.someOtherMethod();
  } catch (EJBException e) {   BusinessDelegateUtil.throwActualException(e);
  }  return null;
  // Statement is never reached}
  
  serviceInterface變量代表EJB本地接口。任何被容器拋出的EJBException實例意味著一個未知錯誤被BusinessDelegateUtil類捕捉和處理,如下面發生的操作:
  
  public static void throwActualException(EJBException e) {  doThrowActualException(e);
  }private static void doThrowActualException(Throwable actual) {  boolean done = false;
  while(!done) {   if(actual instanceof RemoteException) {     actual = ((RemoteException)actual).detail;
  } else if (actual instanceof EJBException) {     actual = ((EJBException)actual).getCausedByException();
  } else {     done = true;
  }  }  if(actual instanceof RuntimeException) {   throw (RuntimeException)actual;
  } else if (actual instanceof Error) {   throw (Error)actual;
  }}
  
  actual異常被摘出并重新被拋出給頂層的客戶端異常處理器。當異常到達處理器時,堆棧信息會是來自服務端且包含實際錯誤的原始異常。沒有多余的客戶端信息被附加。
  
  Swing異常處理器
  
  JVM為每一個控制線程提供了缺省的頂層異常處理器。在異常發生時,處理器輸出Error或RuntimeException的堆棧信息到System.err并且結束線程。這種處理行為與用戶的要求相差很遠而且從調試的觀點來看也不是很優雅。我們需要一種機制在保存堆棧信息和為以后調試預備的唯一請求ID的同時答應通知用戶?!皠摻ɑ贘2EE的應用范圍用戶會話”描述了如何在所有層都可以形成這樣的請求ID。
  
  J2SE1.4以前的版本,在Thread實例中未捕捉的異常將導致其所在的ThreadGroup的uncaughtException()方法被執行。在應用中控制異常處理的簡單方法是繼續ThreadGroup類,重寫uncaughtException()方法,并且確認所有Thread在自定義的ThreadGroup類的實例中啟動。
  J2SE5提供了一種更方便的機制答應在Thread類的實例中安裝UncaughtExceptionHandler實現。處理器在未捕捉的異常到達Thread實例的運行方法中通過回調機制起作用。我們的框架基于J2SE1.3+,因而使用基于繼續ThreadGroup的方法:
  
  private static class SwingThreadGroup extends ThreadGroup {  private ExceptionHandler handler;  public SwingThreadGroup(ExceptionHandler handler) {   super("Swing ThreadGroup");   this.handler = handler;  }  public void uncaughtException(Thread t, Throwable e) {   handler.handle(t, e);  }}
  
  在上面的代碼斷中SwingThreadGroup類重寫了uncaughtException()方法并傳遞Thread實例及拋出Throwable給配置的異常處理器。
  
  在我們在客戶端層控制所有未處理的異常之前還需要做些技巧性的工作。為了使用這個方案有效,所有線程必須與我們的SwingThreadGroup實例關聯。這可以通過生成一個主Thread實例并且通過Runnable實現傳遞SwingThreadGroup實例,這樣就可以執行整個程序了。所有來自這個新的主Thread實例的Thread實例自動加入SwingThreadGroup實例,因此當非強制異常被拋出時會觸發新的異常處理器。
  
 J2EE中的異常治理及錯誤跟蹤框架二(圖)(圖二)
點擊查看大圖

  如圖5中框架在SwingExceptionHandlerController類中實現這個邏輯。應用提供SwingMain接口的實現和異常處理器給控制器。然后控制器必須啟動,同時舊的主線程可以加入新線程中并等待結束。下面的代碼顯示演示應用如何完成這種任務。createAndShowGUI()方法構成實際的應用內容用來初始化Swing組件及傳送控制給用戶。
  
  public DemoApp() {   SwingExceptionHandlerController.setHandler(new DefaultSwingExceptionHandler());
  SwingExceptionHandlerController.setMain(new SwingMain() {   public Component getParentComponent() {     return frame;
  }   public void run() {     createAndShowGUI();
  }  });
  SwingExceptionHandlerController.start();
  SwingExceptionHandlerController.join();
  }
  
  防衛的底線現在在Swing層了,但我們依然需要提供有意義的信息給用戶。演示應用提供了一種更基本的實現,可以簡單地顯示國際化信息的對話框和唯一的用來給支持人員的請求ID。一個更復雜的錯誤處理器可以發送email、SNMP信息或者包含請求ID的技術支持。要害的是客戶端及服務端日志可以用請求ID來過濾從而使基于每個請求的定位更精確。
  
J2EE中的異常治理及錯誤跟蹤框架二(圖)(圖三)

  圖6顯示合并的Swing客戶端及J2EE服務端日志為請求ID為1cffeb4:feb53del38:-7ff6提供精確的定位。注重堆棧信息僅包含來自服務端的信息,而異常就是來自那兒。
  
  雖然為獨立的J2SE應用增加異常處理的底層框架是基礎的,但當我們移植到基于網頁客戶端時還是需要作些改變。
  
  WAR異常處理器
  
  網頁應用在J2EE開發中是比較幸運的,擁有自己安裝異常處理的能力。通過web.xml配置描述文檔,異常和HTTP錯誤可以在servlets或jsp中映射到錯誤頁面。看一下下面的來自web.xml文檔中的示例片斷:
  
  <servlet>
  <servlet-name>ErrorHandlerServlet</servlet-name>
  <servlet-class>dk.rhos.fw.rampart.util.errorhandling.ErrorHandlerServlet</servlet-class></servlet><servlet-mapping>  <servlet-name>ErrorHandlerServlet</servlet-name>
  <url-pattern>/errorhandler</url-pattern></servlet-mapping><error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/errorhandler</location></error-page>
  
  這些標記指示所有未處理的異常會轉到/errorhandler這個URL去,在這里就是映射到ErrorHandlerServlet類。這是一個專門的servlet用來作為網頁組件與異常處理框架之間的橋梁。當來自網頁應用的未處理異常到達servlet容器中,一組包含異常信息的參數會被增加到HttpServletRequest實例并且傳遞給ErrorHandlerServlet類的service方法。下面的片斷例示了service方法:
  
  ...private static final String CONST_EXCEPTION = "javax.servlet.error.exception";
  ...protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
  throws ServletException, IOException {
  Throwable exception = (Throwable)httpServletRequest.getAttribute(CONST_EXCEPTION);
  ExceptionHandler handler = ConfigHelper.getWARExceptionHandler();
  handler.handle(Thread.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品在线欧美视频| 日韩中文第一页| 欧美黄色www| 欧美激情一级二级| 国产成人综合一区二区三区| 精品国产欧美成人夜夜嗨| 国产精品成久久久久三级| 亚洲国产精品久久精品怡红院| 欧美中文字幕视频在线观看| 国产mv免费观看入口亚洲| 91黄色8090| 萌白酱国产一区二区| 久久久久中文字幕2018| 日韩成人激情在线| 精品二区三区线观看| 66m—66摸成人免费视频| 国产欧美精品一区二区三区介绍| 亚洲免费一级电影| 欧美视频中文在线看| 亚洲va久久久噜噜噜久久天堂| 欧美激情精品久久久久久久变态| 97人人模人人爽人人喊中文字| 国产精品自拍偷拍视频| 亚洲精品第一页| 国产成人福利视频| 国产精品com| 91福利视频网| 日韩小视频在线| 国产91精品视频在线观看| 久久精品视频中文字幕| 国产v综合ⅴ日韩v欧美大片| 超碰91人人草人人干| 精品国内产的精品视频在线观看| 日韩国产欧美精品一区二区三区| 2019精品视频| 理论片在线不卡免费观看| 欧美黑人性生活视频| 亚洲午夜激情免费视频| 4p变态网欧美系列| 欧美午夜精品在线| 国产亚洲视频在线观看| 久久91精品国产| 亚洲а∨天堂久久精品9966| 日韩美女中文字幕| 热久久这里只有精品| 国产成人精品999| www.久久久久久.com| 久久中文字幕国产| 色爱精品视频一区| 国产精品自拍视频| 亚洲第一天堂av| 亚洲bt天天射| 欧美黑人又粗大| 国产精品爽爽ⅴa在线观看| 久久久久久久成人| 久久99热这里只有精品国产| 国产精品日韩av| 欧美激情极品视频| 91精品免费视频| 国内免费精品永久在线视频| 97视频免费观看| 久久国产精品首页| 海角国产乱辈乱精品视频| 91精品久久久久久久久青青| 日韩电影免费观看在线观看| 国产精品视频免费在线| 亚洲欧美激情视频| 91av在线精品| 亚洲精品中文字幕有码专区| 精品一区二区三区电影| 国产精品看片资源| 欧美日韩亚洲一区二区三区| 97精品久久久中文字幕免费| 亚洲国产精品悠悠久久琪琪| 性欧美在线看片a免费观看| 国产97在线亚洲| 成人欧美一区二区三区在线| 福利二区91精品bt7086| 中文字幕久久久| 中文字幕亚洲第一| 欧美美女操人视频| 久久久久久久久久久久久久久久久久av| 欧美成人久久久| 久久艳片www.17c.com| 精品国产一区二区三区久久狼黑人| 亚洲国产美女久久久久| www.日韩av.com| 久久久噜噜噜久久中文字免| 91日本在线视频| 亚洲成人免费在线视频| 欧美精品在线极品| 久久精品国产亚洲| 久久人91精品久久久久久不卡| 少妇高潮 亚洲精品| 大伊人狠狠躁夜夜躁av一区| 日韩禁在线播放| 欧美孕妇孕交黑巨大网站| 国产成人综合精品在线| 亚洲欧美日本伦理| 精品国产一区二区三区久久| 亚洲码在线观看| 欧美专区在线播放| 亚洲欧美日本精品| 国产精品一区二区电影| 亚洲日本欧美中文幕| 国内精品400部情侣激情| 日韩精品小视频| 欧美区在线播放| 亚洲色图在线观看| 91精品国产乱码久久久久久久久| 亚洲一级免费视频| 欧美激情免费视频| 国产原创欧美精品| 欧美裸体男粗大视频在线观看| 国产精品小说在线| 欧美—级高清免费播放| 视频在线观看99| 国产成人一区二区三区小说| 国产欧美日韩中文字幕| 国产精品欧美风情| 最近中文字幕2019免费| 九九热在线精品视频| 国产精品毛片a∨一区二区三区|国| 91精品国产99久久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲女成人图区| 久久影院模特热| 欧美孕妇毛茸茸xxxx| 国产精品视频不卡| 欧美极品少妇全裸体| 欧美成aaa人片在线观看蜜臀| 国产在线98福利播放视频| 久久精品久久精品亚洲人| 亚洲国产成人精品电影| 欧美成人国产va精品日本一级| 亚洲精品大尺度| 色偷偷噜噜噜亚洲男人| 亚洲欧美日韩国产成人| 96精品视频在线| 精品人伦一区二区三区蜜桃网站| 1769国产精品| 日本精品久久中文字幕佐佐木| 日韩影视在线观看| 久久理论片午夜琪琪电影网| 亚洲精品白浆高清久久久久久| www日韩中文字幕在线看| 国产亚洲在线播放| 一区国产精品视频| 国产精品极品美女在线观看免费| 日韩精品久久久久久福利| 国产亚洲视频在线| 精品亚洲一区二区三区在线观看| 黑人巨大精品欧美一区免费视频| 91精品国产乱码久久久久久蜜臀| 亚洲在线视频观看| 日韩美女写真福利在线观看| 国外成人在线播放| 国内自拍欧美激情| 2019中文字幕在线免费观看| 国产亚洲美女久久| 亚洲女人天堂视频| 成人精品视频99在线观看免费| 国产精品久久久久久av下载红粉| 欧美韩国理论所午夜片917电影|