2012-09-10 185 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)。