In general.Net programming, exception handling is very straight forward. But this is not the case when it comes to the TPL.
If an exception occurred in a Task, even though if you invoke that Task in a thread where you do the exception handling, the Tasks's exception would bubble up to the OS level. This is simple because the Task is a different thread from the calling thread.
Example :
try { // Some code Task task = new Task.Factory.StartNew (()=> { int i=0; int j= 89/i; } ); // Some code } catch(Exception Ex) { Console.WriteLine("An Exception occurred ! "); } }
This divide by zero error is bubbling up to the OS level.
In order to mitigate this , we need to understand what kind of exception that is been thrown from the Task. We need to capture the AggregateException which is thrown from the code.
try { // Some code Task task = new Task.Factory.StartNew (()=> { int i=0; int j= 89/i; } ); // Some code }
catch(AggregateException Ex){ Console.WriteLine("Exception : {0}", Ex.InnerException.Message); }catch(Exception Ex) { Console.WriteLine("An Exception occurred ! "); } }
If there are more than one exception being thrown or if there are multiple tasks inside the exception handling block,
catch(AggregateException Ex){Ex = Ex.Flatten();foreach(Exception ex in Ex.InnerExceptions) Console.WriteLine("Exception : {0}", ex.Message); }
No comments:
Post a Comment