5

さて、最初に私のコードを示します:

@Override
public void init() throws ServletException {
    super.init();

    try {
        securityController = SecurityControllerFactory.getInstance().create();
    } catch (Exception e) {
        System.err.println("Error creating security controller; " + e.getMessage());
    }

    // max allowed uploaded uploadedFile size is 10 MB
    maxFileSize = getBytes(10);
    maxMemSize = getBytes(2);
}

ご覧のとおり、コンパイラは SecurityController のインスタンス化に try/catch の使用を強制しています。ただし、私の場合、セキュリティコントローラーをインスタンス化できない場合は、サーブレットのインスタンス化を停止し、一般に例外をスローする必要があると考えています。これに対する提案/説明はありますか?

4

3 に答える 3

8

methodの javadoc をinit()注意深く読んでください。

初期化

public void init() throws ServletException

...

スロー:

ServletException- サーブレットの通常の操作を中断する例外が発生した場合

そこを見てください、あなたはそれを として再スローすることになっていServletExceptionます。サーブレット API 仕様の 2.3.2.1 章に準拠すると、サーブレットはサービスに配置されません。

2.3.2.1 初期化時のエラー条件

初期化中に、サーブレット インスタンスはUnavailableExceptionまたは をスローできますServletException。この場合、サーブレットをアクティブなサービスに配置してはならず、サーブレット コンテナーによって解放する必要があります。初期化の失敗と見なされるため、destroy メソッドは呼び出されません。

...

したがって、ドキュメントの状態を実行するだけです(これは通常のプロセスです。ちなみに、Javaの初心者として、それが非常に優れていることを理解/認識する必要があります):

@Override
public void init() throws ServletException {
    try {
        securityController = SecurityControllerFactory.getInstance().create();
    } catch (Exception e) {
        throw new ServletException("Error creating security controller", e);
    }

    maxFileSize = getBytes(10);
    maxMemSize = getBytes(2);
}

super.init()不要な電話は削除しましたのでご了承ください。init()javadoc は、 に対してのみそれを行う必要があることをどこにも伝えていませんinit(ServletConfig)


具体的な問題とは関係ありませんが、過度に一般的なcatchonを持つことは、Exception悪い習慣と見なされます。プログラマーの間違いやバグを意図せずに隠してしまう可能性があるためRuntimeException、過度に一般的なcatchon でsをカバーしたくないことは確かです。Exception

でできるだけ具体的にするようにしてください。これらのメソッドcatchで宣言されている例外をできるだけ具体的にキャッチしてください。throws例えば:

    try {
        securityController = SecurityControllerFactory.getInstance().create();
    } catch (SecurityControllerCreationException e) {
        throw new ServletException("Error creating security controller", e);
    }

別の原因として、問題のメソッドの設計が非常に悪く、それ自体が として宣言されていることも考えられthrows Exceptionます。その部分も同様に修正する必要があります。

于 2013-04-30T02:43:41.483 に答える
-1

本当にそれらをスローしたい場合は、ランタイム例外をスローできます。

try {
   //do stuff
} catch (Exception e) {
   throw new RuntimeException("There was an exception initializing the servlet:  ", e);
}
于 2013-04-30T01:17:05.507 に答える