Salesforce学習記録-Apex での例外

# Apex での例外の基本
下記から抜粋
[　Apex での例外](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_exception_definition.htm)
[　Exception クラスおよび組み込み例外](https://developer.salesforce.com/docs/atlas.ja-jp.234.0.apexcode.meta/apexcode/apex_classes_exception_methods.htm)

## 例外が発生すると何が行われるか
　　・コードの**実行が停止**します。
　　・例外の前に処理された DML 操作は**ロールバック**されてデータベースにはコミットされません。
　　・例外は**デバッグログ**に記録されます。
　　・未対応の例外１：コードがキャッチしない例外の場合、Salesforce から**例外情報を記載したメールが送信**されます。
　　　<例外メール>
　　　　－メール内容：Apex スタック追跡、例外メッセージ、および顧客の組織とユーザ ID を含むメールが送信されます。
　　　　－宛先：失敗したクラスまたはトリガの **LastModifiedBy** 項目で指定された開発者にデフォルトで送信されます。
　　　　　　　　**個別指定**もできる：[設定]⇒[クイック検索] ⇒[**Apex 例外メール**] 
　　・未対応の例外２：エンドユーザの Salesforce **ユーザインターフェースにはエラーメッセージが表示**されます。
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274047/00a74487-f509-897b-4fa4-55aea1188c4a.png)

## Exception のステートメント

### throw のステートメント
  **例外を発生させる**には、throw ステートメントに例外オブジェクトを指定して、特定のエラーに関する情報を提供します。
  例：throw new exceptionObject();

### Try-Catch-Finally のステートメント
　try、catch、finally の各ステートメントを使用して、発生した**例外から適切に復旧できます**。

### キャッチできない例外
　・**ガバナ制限**に達した場合に実行時に発生する制限の**例外 (System.LimitException)** 
　・**ライセンスの例外**
　・**assertメソッド**：アサーションの失敗は、例外としてログに記録されていても、try/catch ブロックを使用して捕捉できません。

## カスタム例外の作成
　・カスタム例外：**Exception クラスを拡張**して、「MyException」のように**クラス名の最後に Exception** を指定します。
　・システム定義の基本クラス Exception を拡張するため、すべての**共通例外メソッドを継承**します。
　・ユーザ定義の例外型は継承ツリーを構成し、catch ブロックでこの継承ツリー内の任意のオブジェクトをキャッチできます。

```Apex:例
      public virtual class BaseException extends Exception {}
      public class OtherException extends BaseException {}
      try { } catch (BaseException e) { }
```

### 例外と内部例外の再発生
　catch ブロックで例外をキャッチしたら、キャッチした例外変数を再発生させることもできます。

```Apex:例
   try { 
     // Throw first exception
     throw new My1Exception('First exception'); 
   } catch (My1Exception e) { 
     // Throw second exception with the first 
     // exception variable as the inner exception
     throw new My2Exception('Thrown with inner exception', e);
   }
```

## 共通例外メソッド
| 名前 | 引数 | 戻り値 | 説明 |
|:-|:-|:-|:-|	
|getCause||Exception|例外オブジェクトとして例外の原因を返します。|
|getLineNumber||Integer|例外が発生した箇所の行番号を返します。|
|getMessage||string|ユーザに表示されるエラーメッセージを返します。|
|getStackTraceString||string|発生した例外のスタック追跡を文字列として返します。|
|getTypeName||string|DmlException、ListException、MathException などの例外型を返します。|
|initCause|Exception cause|	Void|この例外の原因が設定されていない場合は設定します。|
|setMessage|String s|Void|ユーザに表示されるエラーメッセージを設定します。|

### DMLException および EmailException メソッド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274047/aadf3d5b-45ea-e7fc-79dc-bf87789b3be6.png)

## Exception クラスおよび組み込み例外

|例外|説明|
|:-|:-|
|AssertException|コードの実行が停止する System.assert エラー。必要に応じて、assert() メソッドの最後の (msg) 引数で指定したカスタムメッセージを含めます。|
|AsyncException|非同期コールのエンキューの失敗など、非同期処理に関する問題を示す例外。|
|BigObjectException|Big Object オブジェクトレコードに関する問題 (Big Object レコードへのアクセスまたは挿入試行中の接続タイムアウトなど)。|
|CalloutException|外部システムへのコールアウトの失敗など、Web サービス処理に関する問題を示す例外。|
|DmlException|insert ステートメントでレコードの**必要な項目が欠落している場合など**、DML ステートメントに関する問題を示す例外。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274047/074f162c-5d50-48cd-134e-4fb551bd7d63.png)|
|EmailException|送信の失敗など、メールに関する問題を示す例外。詳細は、「送信メール」を参照してください。|
|ExternalObjectException|外部オブジェクトレコードに関する問題 (外部システムに保存されているデータへのアクセス試行中の接続タイムアウトなど)。|
|FinalException|参照のみのコレクションまたはレコード (after-update トリガの sObject やファイナル変数など) を変更しようとする試行。この例外が発生すると実行が停止します。|
|FlowException|Apex からのフローインタビューの開始に関する問題。たとえば、有効なバージョンのフローが見つからない場合や、Apex から開始できない場合などがこれに該当します。|
|HandledException|処理される一般的な例外。|
|IllegalArgumentException|メソッド呼び出しで、**不正な引数**が指定されています。たとえば、Null 以外の引数を要求するメソッドに Null 値が渡された場合に、この例外が発生します。|
|InvalidParameterValueException|無効なパラメータがメソッドに渡されたか、Visualforce ページで使用される URL に関する問題が発生しました。Visualforce についての詳細は、『Visualforce 開発者ガイド』を参照してください。|
|LimitException|**ガバナ制限**を超えました。**この例外は、キャッチできません。**|
|JSONException|JSON の逐次化処理および並列化処理に関する問題を示す例外。詳細は、System.JSON、System.JSONParser、および System.JSONGenerator のメソッドを参照してください。|
|ListException|**範囲外のインデックス**へのアクセスなど、リストに関する問題を示す例外。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274047/5538fafd-d776-cc8e-5e19-cebfecabe9a6.png)|
|MathException|0 による除算など、算術演算に関する問題を示す例外。|
|NoAccessException|現在のユーザがアクセス権を付与されていない sObject へのアクセスなど、承認されないアクセスに関する問題を示す例外。この例外は Visualforce ページで使用します。Visualforce についての詳細は、『Visualforce 開発者ガイド』を参照してください。|
|NoDataFoundException|削除された sObject へのアクセスなど、存在しないデータに関する問題を示す例外。この例外は Visualforce ページで使用します。Visualforce についての詳細は、『Visualforce 開発者ガイド』を参照してください。|
|NoSuchElementException|リストの範囲外の項目にアクセスしようとすると、この例外が発生します。この例外は、イテレータの next メソッドで使用されます。たとえば、iterator.hasNext() == false で iterator.next() をコールすると、この例外が発生します。この例外は、Apex Flex キューメソッドでも使用され、Flex キューの無効な位置にあるジョブにアクセスしようとすると発生します。|
|NullPointerException|次のコードで示す例のような、**null 値の逆参照**に関する問題を示す例外。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274047/fc23b52d-b716-bfd8-4697-3a1306a66591.png)|
|QueryException|**sObject の単一変数**に対する、**レコード**を返さ**ない**、**または複数のレコードを返す**クエリの割り当てなど、SOQL クエリに関する問題を示す例外。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274047/4914e55c-99f3-df3b-152a-55701e121f7c.png)|
|RequiredFeatureMissing|Chatter が有効でない組織にリリースされているコードに Chatter 機能が要求されている。|
|SearchException|SOAP API search() コールで実行される SOSL クエリの問題を示す例外。たとえば、searchString パラメータに含まれる文字数が 2 文字未満。詳細は、『SOAP API 開発者ガイド』を参照してください。|
|SecurityException|Crypto ユーティリティクラスの静的メソッドに関する問題を示す例外。詳細は、「Crypto クラス」を参照してください。|
|SerializationException|データの逐次化に関する問題を示す例外。この例外は Visualforce ページで使用します。Visualforce についての詳細は、『Visualforce 開発者ガイド』を参照してください。|
|SObjectException|insert の間のみ変更可能な update ステートメント内の項目の変更など、sObject レコードに関する問題を示す例外。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274047/26c210ac-0e16-95b5-71bb-3359276d11ae.png) |
|StringException|**ヒープサイズを超える** string など、string に関連する問題を示す例外。|
|TypeException|valueOf メソッドを使用した string 型「a」の integer 型への変換など、型の変換に関する問題を示す例外。|
|UnexpectedException|Salesforce 内の復旧できない内部エラーが発生しました。この例外が発生すると実行が停止します。必要に応じて、Salesforce カスタマーサポートに詳細をお問い合わせください。|
|VisualforceException|Visualforce ページに関する問題を示す例外。Visualforce についての詳細は、『Visualforce 開発者ガイド』を参照してください。|
|XmlException|XML の読み取り、書き込みの失敗など、XmlStream クラスに関する問題を示す例外。|