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 の内容をメールする必要があります。

4

3 に答える 3

1

それは「その他」が何であるかによります。それがメソッドの呼び出し元である場合はdoConnect()、例外をキャッチせずに、それらをスローして呼び出し元メソッドでキャッチします。

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

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

ところで、Java 7では、すべての例外を1つのブロックでキャッチできます。

} 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、例外が発生したときに他のクラスによって更新されるような1つのクラスを実装できます。はExceptionManagerシングルトンである可能性があるため、コードは次のようになります。

public void doConnect() {
    try {
       doConnect(......)
    catch(IllegalAccessException | InstantiationException | SqlException e)
        ExceptionManager.getInstance().exceptionThrown(e);
    }
}
于 2012-09-10T11:19:42.513 に答える
1

同じ例外を再スローするか、アプリケーション固有の例外クラス内にラップします(私の好み):

    ...
} catch (InstantiationException e) {
    ...
    throw new MyAppException(e);
}
于 2012-09-10T11:11:54.627 に答える
0

ログマネージャーのように設計できます。レポートクラスのアプリケーションレベルのインスタンスを取得し、例外処理で例外を処理します。

または、例外を再スローして、アプリケーションの最高レベルでキャッチし、予期しない例外を処理できます(Swingアプリケーションでは、単純なNPEでのクローズを回避するために使用されます)。

于 2012-09-10T11:14:07.243 に答える