コードで例外を処理する

Microsoft Dataverse Web サービスのメソッド呼び出しで返される例外がいくつかあります。 これらの例外をキャッチし、適切に処理するようにアプリケーションを設計する必要があります。 SDK .NET アセンブリでは、すべての Web サービス メソッド呼び出しで、Windows Communication Foundation テクノロジを基盤とするサーバーへの通信チャネルを使用します。 WCF の用語では、このチャネルから返される例外を フォールト と呼びます。

一般的な例外とフォールト

次のコードは、ほとんどの Dataverse Web サービス サンプルで使用されるものです。 アプリケーション デザインで処理する必要がある一般的なフォールトと例外を重点的に示しています。

catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex)
{
    Console.WriteLine("The application terminated with an error.");
    Console.WriteLine("Timestamp: {0}", ex.Detail.Timestamp);
    Console.WriteLine("Code: {0}", ex.Detail.ErrorCode);
    Console.WriteLine("Message: {0}", ex.Detail.Message);
    Console.WriteLine("Inner Fault: {0}",
        null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");
}
catch (System.TimeoutException ex)
{
    Console.WriteLine("The application terminated with an error.");
    Console.WriteLine("Message: {0}", ex.Message);
    Console.WriteLine("Stack Trace: {0}", ex.StackTrace);
    Console.WriteLine("Inner Fault: {0}",
        null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message);
}
catch (System.Exception ex)
{
    Console.WriteLine("The application terminated with an error.");
    Console.WriteLine(ex.Message);

    // Display the details of the inner exception.
    if (ex.InnerException != null)
    {
        Console.WriteLine(ex.InnerException.Message);

        FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> fe = ex.InnerException
            as FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>;
        if (fe != null)
        {
            Console.WriteLine("Timestamp: {0}", fe.Detail.Timestamp);
            Console.WriteLine("Code: {0}", fe.Detail.ErrorCode);
            Console.WriteLine("Message: {0}", fe.Detail.Message);
            Console.WriteLine("Trace: {0}", fe.Detail.TraceText);
            Console.WriteLine("Inner Fault: {0}",
                null == fe.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");
        }
    }
}

注意

検出 Web サービスにアクセスしている場合は、以前に示した DiscoveryServiceFault フォールトではなく OrganizationServiceFault をコードでキャッチする必要があります。

これらの例外とフォールトに加えて、次の例外もコードで処理する必要があります。

Dataverse に接続するときに、Microsoft アカウント が有効であり、アカウントが Dataverse 組織に関連付けられていない場合、SecurityAccessDeniedException 例外がスローされることがあります。 Microsoft アカウントが無効か、認証に失敗する場合、MessageSecurityException がスローされることがあります。

業務ルールからのカスタム エラー

Dataverse では、 カスタマイザーはサーバーで評価される業務ルールを作成します。 カスタマイザーは、ビジネス ルール条件のセットに基づいてエラーメッセージをスローする可能性があります。 開発者は、コードで処理するにしっかりとしたエラーを含め、これらの例外を取得して処理するようにする必要があります。

次の例は、これらのエラーの 1 つが業務ルールから返される際に生成されるトレース ログを示しています。業務ルールの名前はエラーを返すエンティティ スコープの業務ルールの名前で、エラーメッセージはユーザー定義のエラー メッセージです。

Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: custom error messageDetail:   
<OrganizationServiceFault xmlns:i="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://schemas.microsoft.com/xrm/2011/Contracts">  
  <ErrorCode>-2147220891</ErrorCode>  
  <ErrorDetails xmlns:d2p1="https://schemas.datacontract.org/2004/07/System.Collections.Generic">  
    <KeyValuePairOfstringanyType>  
      <d2p1:key>OperationStatus</d2p1:key>  
      <d2p1:value xmlns:d4p1="https://www.w3.org/2001/XMLSchema" i:type="d4p1:string">0</d2p1:value>  
    </KeyValuePairOfstringanyType>  
    <KeyValuePairOfstringanyType>  
      <d2p1:key>SubErrorCode</d2p1:key>  
      <d2p1:value xmlns:d4p1="https://www.w3.org/2001/XMLSchema" i:type="d4p1:string">-2146233088</d2p1:value>  
    </KeyValuePairOfstringanyType>  
  </ErrorDetails>  
  <Message>custom error message</Message>  
  <Timestamp>2014-09-04T17:43:16.8197965Z</Timestamp>  
  <InnerFault i:nil="true" />  
  <TraceText>  
  
[Microsoft.Crm.ObjectModel: Microsoft.Crm.ObjectModel.SyncWorkflowExecutionPlugin]  
[cf6a25a9-5a34-e411-80b9-00155dd8c20f: ]  
Starting sync workflow 'Name of Entity Scope Business Rule returning Error', Id: c76a25a9-5a34-e411-80b9-00155dd8c20f  
Entering ConditionStep1_step:   
Entering SetMessage_step:   
Sync workflow 'Name of Entity Scope Business Rule returning Error' terminated with error 'custom error message'  
  
</TraceText>  
</OrganizationServiceFault>  

詳細情報 : テーブルに対するビジネス ルールの作成

例外に関する追加情報

ユーザーが表示するアクセス許可がない機密情報を含む uncaught の例外がスローされると、例外の機密情報はユーザーから隠され、参照番号が表示されます。 この参照番号は、関連するサーバー イベント ログのエントリとサーバー トレースのエントリを参照します。 システム管理者はこれらのエントリを検索して、例外に関する情報を参照できます。

関連項目

Web サービス エラー コード
プラグインでの例外の処理
.NET Framework デベロッパー センター

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。