コードで例外を処理する

 

公開日: 2017年1月

対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

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

このトピックの内容

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

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

例外に関する追加情報

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

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


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 をコードでキャッチする必要があります。

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

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

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

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

次の例は、これらのエラーの1つが業務ルールから返される際に生成されるトレース ログを示しています。業務ルールの名前は、「Name of Entity Scope Business Rule returning Error」で、エラーメッセージは「custom error message」です。

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="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220891</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
    <KeyValuePairOfstringanyType>
      <d2p1:key>OperationStatus</d2p1:key>
      <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">0</d2p1:value>
    </KeyValuePairOfstringanyType>
    <KeyValuePairOfstringanyType>
      <d2p1:key>SubErrorCode</d2p1:key>
      <d2p1:value xmlns:d4p1="http://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>

詳細:TechNet: 業務ルールの作成および編集

例外に関する追加情報

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

関連項目

トラブルシューティングとエラー処理
トラブルシューティングのヒント
Web service error codes
プラグインでの例外の処理
.NET Framework デベロッパー センター

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 著作権