tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Apex開発でのエラーハンドリング処理で避けたほうが良い実装について

個人的に思っているApex開発でのエラーハンドリング処理で避けたほうが良い実装方法を紹介します。

f:id:tyoshikawa1106:20200614133245p:plain

サンプル①
if (isError) {
    System.debug('エラーが見つかったため処理を終了');
    return;
}
サンプル②
try {
    // ・・・何かの処理・・・
} catch(Exception e) {
   System.debug('エラーが見つかったため処理を終了');
   return;
}


上記のようにエラー発生時にSystem.debug処理だけ動かして処理を終了する方法はエラー自体に気づけ無い可能性が高いので避けたほうが良いのではと個人的には考えています。

上記判定処理での運用時に考えられる障害例

ケース①
  • Visualforceでデータ登録を行う画面を開発。ユーザが利用を開始。
  • 登録処理を実行時にエラーが発生。System.debug処理が呼び出され処理が終了する。
  • 画面上何も変化が無いため、ユーザは問題が起きているのか判断がしずらい。

【ユーザがシステム管理者に相談】
・管理者が原因の調査を開始できる。しかし画面上反応が無いため調査は難航。
【ユーザが管理者に相談せずに作業終了】
・エラー発生は誰に知られることなく闇の中へ。
・管理者が気づいた頃には異常系データが大量生産されている。

ケース②
  • Apexバッチでデータ更新を行う機能を開発。
  • スケジュールバッチ化して定期的に実行する。
  • バッチ処理内でエラーが発生。System.debug処理が呼び出され処理が終了する。

・通常、バッチ処理内でエラーが発生すると管理者宛に通知メールが届く。また、Apexジョブのページでもエラーメッセージを確認することができるので異常に気付くことができる。
・System.debugを呼び出して終了することで、バッチ処理は正常に終了したように見えてしまう。→データの更新結果をチェックしないとエラーに気付けない。

代わりの実装案

やめたほうが良いですと書くからには代わりの実装案を書かないと行けないと思うので紹介します。下記のように対応すると良いと思います。

  • 画面系の開発の場合は、ユーザがわかるようにエラーメッセージを表示する。
  • トリガやバッチ系の開発の場合はtry-catchとか無くてもエラー発生時に通知やロールバックの仕組みがあります。(やりたいことによっては自作で判定処理を作り込みする場合もあるので状況によりますが。)
  • 通常発生しないエラーの場合は、管理者宛に通知メールを送付する仕組みを用意します。これにより異常発生にも管理者がすぐに対処することが可能です。

※エラー発生時にユーザから報告がもらえない場面は普通に発生します。連絡が無くても管理者側で把握できるようにするのが大切です。

関連記事