【Struts2框架】第五節宣告式異常處理-處理異常的過程
阿新 • • 發佈:2019-02-09
如何抓到異常的?
步驟:(以之前寫的小樣例為例)
如果CategoryService中的list方法出錯(category_表不存在):
此時CategoryAction接收到CategoryService中的list方法丟擲的異常:
CategoryAction中的throws Exception繼續向外拋異常,之後struts.xml接住
其中 <exception-mapping result="error" exception="java.sql.SQLException"/>
java.sql.SQLException異常有對應的result,找到result(error.jsp),顯示異常的介面
在error.jsp中利用[Debug]可以看到,棧值中有exception,詳細為:
exception java.sql.SQLException: Table 'bbs2014.category_' doesn't exist
友好介面裡最好寫“出錯了,請聯絡管理員”,要比“請稍後再試”好多了
全域性的異常處理:
如果需要收集的異常過多,那麼需要全域性的異常處理機制,在struts中這樣配置:
步驟:(以之前寫的小樣例為例)
如果CategoryService中的list方法出錯(category_表不存在):
做到兩點:throws SQLException和throw(e);public List<Category> list()throws SQLException{ Connection conn=DB.createConn(); String sql="select * from category_"; PreparedStatement ps=DB.prepare(conn, sql); List<Category> categories=new ArrayList<Category>(); try { ResultSet rs=ps.executeQuery(); Category c=null; while(rs.next()){ c=new Category(); c.setId(rs.getInt("id")); c.setName(rs.getString("name")); c.setDescription(rs.getString("description")); categories.add(c); } } catch (SQLException e) { e.printStackTrace(); throw(e);//向外丟擲異常 } DB.close(ps); DB.close(conn); return categories; }
此時CategoryAction接收到CategoryService中的list方法丟擲的異常:
public String list()throws Exception{
categories=categoryService.list();
return SUCCESS;
}
注意加:throws ExceptionCategoryAction中的throws Exception繼續向外拋異常,之後struts.xml接住
<action name="*-*" class="cn.hpu.bbs.action.{1}Action" method="{2}"> <result>/admin/{1}-{2}.jsp</result> <result name="input">/admin/{1}-{2}.jsp</result> <result name="update">/admin/{1}-{2}.jsp</result> <exception-mapping result="error" exception="java.sql.SQLException"/> <result name="error">/error.jsp</result> </action>
其中 <exception-mapping result="error" exception="java.sql.SQLException"/>
java.sql.SQLException異常有對應的result,找到result(error.jsp),顯示異常的介面
在error.jsp中利用[Debug]可以看到,棧值中有exception,詳細為:
exception java.sql.SQLException: Table 'bbs2014.category_' doesn't exist
友好介面裡最好寫“出錯了,請聯絡管理員”,要比“請稍後再試”好多了
全域性的異常處理:
如果需要收集的異常過多,那麼需要全域性的異常處理機制,在struts中這樣配置:
struts中支援宣告式的異常處理指的是,要是有異常,就向外拋,最後會給一個統一的介面,然後讓你在特定的頁面做出處理。<package name="bbs2014_default" extends="struts-default"> <global-results> <result name="error">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="error" exception="java.sql.SQLException"/> </global-exception-mappings> </package> <!--extends="bbs2014_default"繼承上面那個公用package--> <package name="admin" namespace="/admin" extends="bbs2014_default"> <action name="*-*" class="cn.hpu.bbs.action.{1}Action" method="{2}" > <result>/admin/{1}-{2}.jsp</result> <result name="input">/admin/{1}-{2}.jsp</result> <result name="update">/admin/{1}-{2}.jsp</result> </action>