Senkron çalışan plug-in’ler Sandbox’da olsun ya da olmasın herhangi bir hata ile karşılaştıklarında geriye kullanıcıya uyarı gösterecek bir yapıya sahiptirler ve bu durumu Dynamics CRM yönetir. Yani siz sadece hatayı geriye dondurursunuz.
Asenkron çalışan yapılar için CRM içerisinde System Job(AsyncOperation) isimli bir bolum yer almaktadır. İşte asenkron hataları da buradan takip edebilirsiniz.
Senkron çalışan plug-in’lerde ise hata mesajlarını InvalidPluginException türünden bir hata göndererek kontrol edebilirsiniz. Message özelliğine herhangi bir değer gönderirseniz sistem onu gösterir aksi takdirde varsayılan hata mesajı görüntülenir.
Ayrıca sunu da belirteyim Sandbox içinde çalışmayan plug-in’ler için hata mesajları sistemin çalıştığı Server’daki Olay Görüntüleyici içerisinde Uygulama hataları bolumu içerisine de kaydedilir.
Plug-in içerisinde uygun gördüğünüz yerde su şekilde hata fırlatabilirsiniz:
throw new InvalidPluginExecutionException(“The account number can only be set by the system.”);
Bir plug-in hata fırlattığında CRM su şekilde bir uyarı vermektedir.
Resim-1
Log dosyasını incelediğimizde de detayları 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 sınıfına sahip olmak ve yazdığınız bütün kodlarda kullanmak isterseniz su şekilde bir Exception mimarisini yazdığınız kodda kullanabilirsiniz. Fakat burada unutmamanız gereken nokta siz hata fırlatmaz hataları kendiniz Handle ederseniz CRM kullanıcıya hata mesajı göndermeyecektir. Bunun için InvalidPluginException’i siz fırlatmalısınız.
Aşağıdaki kodu Plug-in’ler içerisinde kullanmanızı pek tavsiye etmem çünkü sistem gayet detaylı bir geri bildirim yapmakta ama bir hata alıyor ve isin içinden çıkamıyorsanız bu kodu denemenizde fayda olabilir. Hatayı Server’da ya da CRM içinde bir yerlere yazdırıp imceleyebilirsiniz. Yine uygun gördüğünüz bir yerde kullanıcıya hata göstermek istiyorsanız “InvalidPluginExecutionException” fırlatmayı unutmayın.
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”);
}
}
}
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar