1. 程式人生 > >【Struts2框架】第五節宣告式異常處理-處理異常的過程

【Struts2框架】第五節宣告式異常處理-處理異常的過程

如何抓到異常的?
步驟:(以之前寫的小樣例為例)

如果CategoryService中的list方法出錯(category_表不存在):
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;
	}
做到兩點:throws SQLException和throw(e);

此時CategoryAction接收到CategoryService中的list方法丟擲的異常:
public String list()throws Exception{
		categories=categoryService.list();
		return SUCCESS;
	}
注意加:throws Exception

CategoryAction中的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中這樣配置:
<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>
struts中支援宣告式的異常處理指的是,要是有異常,就向外拋,最後會給一個統一的介面,然後讓你在特定的頁面做出處理。