この記事の目次
dmlexceptionとは?

サンプルコード
以下に、Salesforceのdmlexception例外処理のサンプルコードを説明します。 SalesforceのApexコードで、DMLステートメントに関しての問題が発生した場合、「catch (System.DmlException e)」側の処理が実行されます。「e.getDmlMessage」メソッドは、問題が発生したユーザーメッセージを取得できます。Account[] accts = new Account[]{new Account(billingcity = 'San Jose')};
try {
insert accts;
} catch (System.DmlException e) {
for (Integer i = 0; i < e.getNumDml(); i++) {
// Process exception here
System.debug(e.getDmlMessage(i));
}
}
例外処理の共通メソッド
Salesforceの例外処理には、共通で使用できるメソッドが用意されています。 1.「getCause」メソッド 例外オブジェクトとして原因を返します。 2.「getLineNumber」メソッド 例外発生の箇所の行番号を返します。 3.「getMessage」メソッド 例外発生時にユーザーに示されるエラーメッセージを返します。 4.「getStackTraceString」メソッド スタック追跡を返します。 5.「getTypeName」メソッド DmlException、ListException、MathException など例外型を返します。 6.「initCause」メソッド 例外処理が設定されていない場合に設定します。 7.「setMessage」メソッド 例外発生時にユーザーに示されるエラーメッセージを設定します。dmlexceptionの専用メソッド
Salesforceのdmlexceptionには、専用のメソッドも用意されています。 1.「getNumDml」メソッド 問題が発生した行数を返します。 2.「getDmlFieldNames」メソッド 問題が発生した行の項目名を返します。引数には行No.を指定します。 3.「getDmlFields」メソッド 問題が発生した行の項目トークンを返します。引数には行No.を指定します。 4.「getDmlId」メソッド 問題が発生した行のレコードIDを返します。引数には行No.を指定します。 5.「getDmlIndex」メソッド 問題が発生した行の元の位置を返します。引数には行No.を指定します。 6.「getDmlMessage」メソッド 問題が発生した行のユーザーメッセージを返します。引数には行No.を指定します。 7.「getDmlType」メソッド 問題が発生した行のApex失敗コードを返します。「getDmlType」メソッドのサンプルコード
dmlexceptionの「getDmlType」メソッドのサンプルコードを説明します。 「getDmlType」メソッドは、問題が発生した行のApex失敗コードを列挙型のSystem.StatusCodeの値で返します。try {
insert new Account();
} catch (System.DmlException ex) {
System.assertEquals(
StatusCode.REQUIRED_FIELD_MISSING,
ex.getDmlType(0));
}
dmlexception例外処理の確認方法

Merchandise__c m = new Merchandise__c();
insert m;
上記のサンプルコードでは、「insert」DMLステートメントで必須の項目を指定せず、商品品目を指定しているので、次のようなエラーメッセージが出て異常終了します。
System.DmlException: Insert failed. First exception on row 0; first error: REQUIRED_FIELD_MISSING, Required fields are missing: [Description, Price, Total Inventory]: [Description, Price, Total Inventory]
dmlexception例外処理の実装
サンプルコードで問題が発生しても異常終了しないように、dmlexception例外処理を実装します。 以下のサンプルコードでは、例外処理が実行された場合、「The following exception has occurred: (エラーメッセージ)」を表示します。try {
Merchandise__c m = new Merchandise__c();
insert m;
} catch(DmlException e) {
System.debug('The following exception has occurred: ' + e.getMessage());
}
Salesforceのdmlexceptionを活用しよう!
