tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Apex開発とシステムエラー発生時の対応について

Apex開発するときに個人的に重要と思っているのがシステムエラー発生時の検知についてです。下記のようにエラーメールを管理者に送信するようにすると予期せぬトラブルやシステムのバグにすばやく対応が可能になります。
f:id:tyoshikawa1106:20190324125325p:plain


こうした機能を実装するときは「try-catch」処理を使用します。

try {
    // 処理
} catch(DmlException e) {
    // DMLエラー発生時の処理
} catch(Exception e) {
    // システムエラー発生時の処理
}


エラー発生時のメッセージは下記のような感じで取得できます。

// DMLエラーメッセージ
e.getDmlMessage(0);
// Exceptionエラーメッセージ
e.getMessage();


システムエラー発生時の対応でよく見る実装方法として下記のような書き方が見られる気がしています。

try {
    // 処理
} catch(DmlException e) {
    System.debug(e.getDmlMessage(0));
} catch(Exception e) {
    // システムエラー発生時の処理
   System.debug(e.getMessage());
}


System.debug処理でログを表示する方法です。システム開発中や不具合発生後の検証用途としては良いのかもしれませんが、通常の運用時ではユーザもシステム管理者もエラーに気づくことができないと思われます。(システムエラーが発生しているのに正常系として実行されてしまいます。)


そこで下記のようなメール送信処理を用意して対応します。
※クラス名は『CommonEmail』としています。

/**
 * Exceptionエラーメールの本文取得
 */
private static String getSendExceptionEmailBody(String message, Exception e) {
    String errorMsg = message;
    errorMsg += '\n';
    errorMsg += '実行ユーザ名: ' + UserInfo.getUserName();
    errorMsg += '\n\n';
    errorMsg += e.getTypeName() + ' ' + e.getMessage();
    errorMsg += '\n';
    errorMsg += e.getStackTraceString();
    
    return errorMsg;
}


これをcatch処理内で次のように呼び出します。

} catch(DmlException e) {
    CommonEmail.sendEmailByExceptionError(e);
    errorMessage = e.getDmlMessage(0);
    return errorMessage;
} catch(Exception e) {
    CommonEmail.sendEmailByExceptionError(e);
    errorMessage = '申し訳ございません。処理中にエラーが発生しました。';
    return errorMessage;
}


これでシステムエラー発生時にシステム管理者に対してどのクラスの何行目の処理でエラーが発生しているかが細かく通知されます。ユーザIDも表示しておけばどのユーザが処理に失敗して困っているかも確認できます。


return処理でエラーメッセージを返すようにしてそれを画面に表示すればユーザ側にも処理が失敗したと通知ができます。Exceptionエラーを表示するとユーザに親切ではなくなってしまいますが、DmlExceptionエラーのメッセージならユーザにある程度親切なメッセージを表示できます。


DmlExceptionは標準カスタマイズ側の入力規則エラーメッセージもcatchして表示できます。特定の入力規則エラーが頻繁に発生している場合はデータ登録ページのUXの見直しをするといった判断にも使用できます。


以上がApex開発とシステムエラー発生時の対応についてです。こうした例外系の対応もしておくようにするとSalesforceで構築したシステムの品質が向上すると思います。

関連