Bu makalede plug-in hata yakalama mekanizmasina deginecegim. Senkron calisan plug-in’ler sandbox’da olsun ya da olmasin
herhangi bir hata ile karsilastiklarinda geriye kullaniciya uyari gösterecek
bir yapiya sahiptirler ve bu durumu Dynamics CRM yönetir. Yani siz sadece
hatayi geriye dondurursunuz.
Asenkron calisan yapilar için CRM içerisinde System
Job(AsyncOperation) isimli bir bolum yer almaktadır. Iste asenkron hatalari da
buradan takip edebilirsiniz.
Senkron calisan plug-in’lerde ise hata mesajlarini
InvalidPluginException turunden bir hata göndererek kontrol edebilirsiniz.
Message ozelligine herhangi bir değer gönderirseniz sistem onu gösterir aksi
takdirde varsayilan hata mesaji görüntülenir.
Ayrica sunu da belirteyim Sandbox içinde calismayan
plug-in’ler için hata mesajlari sistemin calistigi serverdaki Olay Goruntuleyici
içerisinde Uygulama hatalari bolumu içerisine de kaydedilir.
Plug-in içerisinde uygun gordugunuz yerde su sekilde hata
fırlatabilirsiniz:
throw new InvalidPluginExecutionException("The account number can only be set by the
system.");
Bir plug-in hata firlattiginda CRM su sekilde bir uyari
vermektedir.

Log dosyasini incelediğimizde de detaylari almaktayız. Bizim
gönderdiğimiz mesaja dikkat edin lütfen;
Unhandled
Exception:
System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault,
Microsoft.Xrm.Sdk, Version=7.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35]]: The account number can only be set by the
system.
Detail:
<OrganizationServiceFault xmlns="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorCode>-2147220970</ErrorCode>
<ErrorDetails xmlns:a="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
<KeyValuePairOfstringanyType>
<a:key>CallStack</a:key>
<a:value i:type="b:string" xmlns:b="http://www.w3.org/2001/XMLSchema">
at
Microsoft.Crm.Sdk.Samples.AccountNumberPlugin.Execute(IServiceProvider
serviceProvider)
at
PluginProfiler.Library.PluginAppDomainProxy.ExecuteCore(Stopwatch watch,
ProfilerExecutionReport report, Object instance, Object executionParameter)
at
PluginProfiler.Library.AppDomainProxy.Execute(ProfilerExecutionConfiguration
configuration, ProfilerExecutionReport report)
</a:value>
</KeyValuePairOfstringanyType>
</ErrorDetails>
<Message>The
account number can only be set by the system.</Message>
<Timestamp>2015-04-08T15:29:50.7437667Z</Timestamp>
<InnerFault i:nil="true" />
<TraceText i:nil="true" />
</OrganizationServiceFault>
Ama siz temel bir hata yönetim sinifina sahip olmak ve
yazdiginiz butun kodlarda kullanmak isterseniz su sekilde bir Exception
mimarisini yazdiginiz kodda kullanabilirsiniz. Fakat burada unutmamaniz gereken
nokta siz hata fırlatmaz hatalari kendiniz Handle ederseniz CRM kullaniciya
hata mesaji göndermeyecektir. Bunun için InvalidPluginException’i siz
firlatmalisiniz.
Asagidaki kodu Plug-in’ler içerisinde kullanmanizi pek
tavsiye etmem cunku sistem gayet detayli bir geri bildirim yapmakta ama bir
hata aliyor ve isin içinden cikamiyorsaniz bu kodu denemenizde fayda olabilir.
Hatayi serverda ya da CRM içinde bir yerlere yazdırıp incelebilrisiniz. Yine
uygun gordugunuz bir yerde kullaniciya hata göstermek istiyorsaniz “InvalidPluginExecutionException”
firlatmayi unutmayin.
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");
}
}
}