Java 如何访问从另一个类引发的异常

Java 如何访问从另一个类引发的异常,java,Java,我的要求是在出现异常情况时自动发送邮件 public Connection dbConnect(String dbconnectionstring,String userid,String userpassword) { Connection connection = null; System.out.println(); try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newI

我的要求是在出现异常情况时自动发送邮件

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的内容(如果出现任何异常),那么应该在代码中编写什么来知道是否出现任何异常?如果引发异常,则应邮寄电子邮件内容。

重新引发相同的异常,或将其包装在特定于应用程序的异常类中(我的首选):


您可以将其设计为日志管理器:获取报表类的应用程序级实例,并在异常处理中使其处理异常

或者您可以重新播放异常并在应用程序的最高级别捕获它,在该级别它可以处理任何意外的异常(在Swing应用程序中使用以避免关闭简单的NPE)。

这取决于“其他”是什么。如果它是
doConnect()
方法的调用者,只需不捕捉异常,而是抛出异常并捕捉调用者方法:

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

public void theCaller() {
    try {
    doConnect(......)
    } catch(InstantiationException e) {
    }
    } catch(IllegalAccessException e) {
    }
/// etc
}
顺便说一句,在java 7中,您可以在一个块中捕获所有异常:

}catch(IllegalAccessException | instantionationexception | SqlException e)

或者,您可以使用其他可以选中或取消选中的异常(运行时)包装特定的异常,例如

现在,调用方可以捕获非法状态异常并提取其原因

然而,如果您需要某种异步侦听器来管理所有异常,那么您可以实现一个类,如
ExceptionManager
,当异常发生时,该类将由其他类更新。
ExceptionManager
可能是单例的,因此代码如下所示:

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

您应该阅读有关这方面的官方文档,它很好地解释了:您使用什么java邮件API?
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;
}
public void doConnect() {
    try {
       doConnect(......)
    catch(IllegalAccessException | InstantiationException | SqlException e)
        ExceptionManager.getInstance().exceptionThrown(e);
    }
}