我的要求是在出现异常时发送自动邮件
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;
现在在另一个类中,如果我想访问Exception e的内容(如果有任何异常引发),应该在我的代码中写什么来知道是否引发了任何异常?如果提出异常,应该邮寄e的内容。
答案 0 :(得分:1)
重新抛出相同的异常,或将其包装在特定于应用程序的异常类(我的首选项)中:
...
} catch (InstantiationException e) {
...
throw new MyAppException(e);
}
答案 1 :(得分:1)
这取决于“其他”是什么。如果它是你的doConnect()
方法的调用者,只是不要捕获异常但抛出它们并捕获调用方法:
public void doConnect(....) throws InstantiationException, IllegalAccessException, .......{
}
public void theCaller() {
try {
doConnect(......)
} catch(InstantiationException e) {
}
} catch(IllegalAccessException e) {
}
/// etc
}
在java 7中BTW,您可以在一个块中捕获所有异常:
} 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);
}
}
答案 2 :(得分:0)
您可以将其设计为日志管理器:获取报表类的应用程序级实例,并在异常处理中使其处理异常。
或者您可以重新抛出异常并在应用程序的最高级别捕获它,它可以处理任何意外的异常(在Swing应用程序中使用以避免关闭简单的NPE)。