处理代码中的异常

 

发布日期: 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");
        }
    }
}

备注

如果要访问 Discovery Web Service,您的代码应该捕获 DiscoveryServiceFault 而不是上面所示的 OrganizationServiceFault 错误。

除这些异常和错误之外,您的代码还必须处理以下异常:

连接到 Microsoft Dynamics 365 (online) 时,如果使用了有效的 Microsoft 帐户,但您的帐户未与任何 Microsoft Dynamics 365 (online) 组织相关联,则会引发 SecurityAccessDeniedException 异常。 如果您的 Microsoft 帐户 无效或身份验证失败,可引发 MessageSecurityException

来自业务规则的自定义错误

使用 Microsoft Dynamics 365 和 Microsoft Dynamics 365 (online),定制员可以创建在服务器上进行评估的业务规则。 定制员可以引发基于设置在业务规则中的条件的错误消息。 开发人员应该确保将可靠的错误处理包含在其代码中,以捕获和处理这些异常。

以下是在从名为“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:创建和编辑业务规则

有关异常的其他信息

当引发包含用户无权查看的敏感信息的未捕获异常时,异常中的敏感信息将对用户隐藏,并提供一个参考编号。 参考编号指向相关的服务器事件日志条目和服务器跟踪条目。 系统管理员可以查看这些条目并找到有关该异常的详细信息。

另请参阅

疑难解答和错误处理
疑难解答提示
Web service error codes
处理插件中的异常
.NET Framework 开发人员中心

Microsoft Dynamics 365

© 2017 Microsoft。 保留所有权利。 版权