私は例外について広範な調査を行いましたが、まだ迷っています。やっていいこと、やらなかったことを知りたいです。
また、次の例について専門家の意見をお聞かせください。
public void myprocess(...) {
boolean error = false;
try {
// Step 1
try {
startProcess();
} catch (IOException e) {
log.error("step1", e);
throw new MyProcessException("Step1", e);
}
// Step 2
try {
...
} catch (IOException e) {
log.error("step2", e);
throw new MyProcessException("Step2", e);
} catch (DataAccessException e) {
log.error("step2", e);
throw new MyProcessException("Step2", e);
}
// Step 3
try {
...
} catch (IOException e) {
log.error("step3", e);
throw new MyProcessException("Step3", e);
} catch (ClassNotFoundException e) {
log.error("step3", e);
throw new MyProcessException("Step3", e);
}
// etc.
} catch (MyProcessException mpe) {
error = true;
} finally {
finalizeProcess(error);
if (!error) {
log.info("OK");
} else {
log.info("NOK");
}
}
}
- グローバルな try...catch...finally を管理するために、各ステップで個人的な例外 (MyProcessException) をスローしても問題ありませんか?
- ステップごとに既知の各例外を管理してもよろしいですか?
ご協力ありがとうございました。
編集1:
このような良い習慣はありますか?メッセージを取得してグローバル catch に直接ログインし、上位レベルで try...catch(Exception)....
目的は、ステップが失敗した場合に停止し、プロセスを終了することです (エラーかどうかに関係なく)。
In Controller
public void callProcess() {
try {
myprocess(...);
} catch (Exception e) {
log.error("Unknown error", e);
}
}
In Service
public void myprocess(...) {
boolean error = false;
try {
// Step 1
try {
startProcess();
log.info("ok");
} catch (IOException e) {
throw new MyProcessException("Step1", e);
}
// Step 2
try {
...
} catch (IOException e) {
throw new MyProcessException("Step2", e);
} catch (DataAccessException e) {
throw new MyProcessException("Step2", e);
}
// Step 3
try {
...
} catch (IOException e) {
throw new MyProcessException("Step3", e);
} catch (ClassNotFoundException e) {
throw new MyProcessException("Step3", e);
}
// etc.
} catch (MyProcessException mpe) {
error = true;
log.error(mpe.getMessage(), mpe);
} finally {
finalizeProcess(error);
if (!error) {
log.info("OK");
} else {
log.info("NOK");
}
}
}
ありがとうございました。
編集2:
下位レベルで (Exception e) をキャッチし、個人的な例外をスローするのは本当に悪い習慣ですか?