【C#】【Dynamics CRM】Pluginにおけるトレースと例外処理
Dynamics CRM Pluginでの例外処理、例外の確認方法が同期・非同期などで異なるので、その点について確認していきたいと思います。
例外処理結果の違い
Dynamics CRM Pluginで例外をスローすると、同期・非同期で結果の表示方法が違います。
同期であれば、Web アプリケーション ユーザー インターフェイスのダイアログ形式でエラーメッセージが表示されますが
非同期ですとシステムジョブのレコードに記録されます。
実際の表示例は以下のコードの下に記載しています。
例外処理時のメッセージ・ログの記載について
またDynamics CRM SDKでサポートされる例外処理時におけるメッセージ・ログに関しては、大きく分けて2つ存在します。
1つは【InvalidPluginExecutionException】です。
例外をスローする際に【InvalidPluginExecutionException】を利用することで、ダイアログやシステムジョブにメッセージを表示することができます。
もう1つは【ITracingService】です。 IServiceProviderよりインスタンスを取得できるITracingServiceのTraceメソッドを利用することで、Pluginプログラム内部で処理の状況をトレースログとして記録することができます。
メッセージ・ログの注意
ログで注意するべき点として、上記トレースログやメッセージは、同期であれば例外処理が実行された際(処理が失敗した際)にしか確認することができませんし、非同期でも成功時にログを残す設定にしていなければ、失敗時にしか情報を確認することができません。 (成功時のログを残し続けるのもあまりよろしくないでしょう……。)
コード例
以下のコードで実際の出力結果を確認してみたいと思います。
今回は、取引先企業(Account)エンティティのCreateMessageに登録したPluginコードで 【InvalidPluginExecutionException】と【ITracingService】を利用してみました。
フリガナが入力されていなければ、例外処理を行う形になっています。
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; namespace MyProject.Plugin { public class TraceService : IPlugin { public void Execute(IServiceProvider serviceProvider) { var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); var trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); trace.Trace("Plugin Trace Start"); if (!context.InputParameters.Contains("Target") || !(context.InputParameters["Target"] is Entity)) return; var inputParameter = (Entity)context.InputParameters["Target"]; trace.Trace("Set Input Paramter"); if (!inputParameter.Contains("yominame")) { trace.Trace("Error!"); throw new InvalidPluginExecutionException("フリガナを入力して下さい。"); } } } }
実行結果
以下、実行結果です。
■同期の場合の例外
InvalidPluginExecutionExceptionの引数がメッセージとして表示されています。
■非同期の場合の例外
システムジョブの中にInvalidPluginExecutionExceptionの引数がメッセージとして表示されています。
また、以下の様な形でログが出力されています。
ログの下部にITracingServiceで出力したトレースログが記載されていることがわかります。
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: フリガナを入力して下さい。Detail: <OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://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>フリガナを入力して下さい。</Message> <Timestamp>2015-04-16T01:25:18.784068Z</Timestamp> <InnerFault i:nil="true" /> <TraceText> [MyProject.Plugin: MyProject.Plugin.TraceService] [dd86ec85-72e2-e411-80d8-c4346bc4ef58: MyProject.Plugin.TraceService: Create of account] Plugin Trace Start Set Input Paramter Error! </TraceText> </OrganizationServiceFault>