2012-09-10 144 views
0

我的要求提出的例外是每當引發異常如何訪問從另一個類

public Connection dbConnect(String dbconnectionstring,String userid,String userpassword) 
{ 
    Connection connection = null; 
    System.out.println(); 
    try { 
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); 
    connection = DriverManager.getConnection(dbconnectionstring,userid,userpassword); 
    System.out.println("connected to" + dbconnectionstring); 

    } catch (InstantiationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return connection; 

發送自動郵件現在在其他類,如果我想訪問異常e的內容(如果有的話異常引發),我的代碼中應該寫些什麼來知道是否引發異常?如果引發異常,應該郵寄e的內容。

+0

你應該閱讀這官員文檔,它解釋得很好:HTTP://docs.oracle.com/javase/tutorial/essential/ exceptions/index.html –

+0

你使用什麼java郵件API? –

回答

1

這取決於「其他」是什麼。如果這是你doConnect()方法的調用者就是不捕獲異常,但把他們和趕上主叫方法:

public void doConnect(....) throws InstantiationException, IllegalAccessException, .......{ 
} 

public void theCaller() { 
    try { 
    doConnect(......) 
    } catch(InstantiationException e) { 
    } 
    } catch(IllegalAccessException e) { 
    } 
/// etc 
} 

BTW在Java 7中,你可以捕獲所有異常在一個塊:

} catch(IllegalAccessException | InstantioationException | SqlException e)

或者,您可以使用其他可以選中或不選中的異常(運行時)來包裝特定異常,例如

public Connection dbConnect(String dbconnectionstring,String userid,String userpassword) 
{ 
    Connection connection = null; 
    System.out.println(); 
    try { 
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); 
    connection = DriverManager.getConnection(dbconnectionstring,userid,userpassword); 
    System.out.println("connected to" + dbconnectionstring); 

    } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) { 
     throw new IllegalStateException("Connection failure", e); 
    } 

    return connection; 
} 

現在調用者可能會捕獲IllegalStateException並提取其原因。

如果您需要某種異步監聽器來管理所有異常,那麼您可以實現一個類,例如ExceptionManager,當異常發生時它正在被其他類更新。該ExceptionManager可能是單身,所以代碼看起來就像這樣:

public void doConnect() { 
    try { 
     doConnect(......) 
    catch(IllegalAccessException | InstantiationException | SqlException e) 
     ExceptionManager.getInstance().exceptionThrown(e); 
    } 
} 
+0

+1單個捕獲中的多重例外是一個很好的功能。 – basiljames

1

重新拋出同樣的異常,或把它包一個應用程序特定的異常類中(我的偏好):

... 
} catch (InstantiationException e) { 
    ... 
    throw new MyAppException(e); 
} 
0

您可以設計它像一個日誌管理器:獲取的應用級比如你報告類,並在異常處理中,使其處理異常。

或者您可以重新拋出異常並將其捕獲到應用程序的最高級別,以便處理任何意外的異常(用於Swing應用程序以避免關閉簡單的NPE)。