Catching Error when using Task.Factory

.net, c#, multithreading

Solution

Alternatively, you can chain your task creation and add a ContinueWith:

var job = Task.Factory
    .StartNew(...)
    .ContinueWith(tsk => 
         {
              // check tsk for exception and handle
         });

EDIT: This snippet, when run, pops up the message box for me:

void Main()
{
    var serial = "some serial";
    var task =  Task.Factory
        .StartNew(() => DoPrintConfigPage(serial))
        .ContinueWith(tsk =>
        {
            MessageBox.Show("something broke");
            var flattened = tsk.Exception.Flatten();

            // NOTE: Don't actually handle exceptions this way, m'kay?
            flattened.Handle(ex => { MessageBox.Show("Error:" + ex.Message); return true;});
        },TaskContinuationOptions.OnlyOnFaulted);

}

public void DoPrintConfigPage(string serial)
{
    throw new Exception("BOOM!");
}

Problem

i am using the following ``` Task.Factory.StartNew(() => DoPrintConfigPage(serial)); ``` then the function i am calling looks like this ``` private void DoPrintConfigPage(string serial) { //do printing work } ``` My problem is an exception is being thrown inside the thread and not being handled. I have tried wrapping it in a try catch ``` try { Task.Factory.StartNew(() => DoPrintConfigPage(serial)); } catch (Exception ex) { } ``` but it still is not catching the error and thus crashing the application. How can I catch exceptions in the main thread so I can handle them? Update I have made the changes recommended below and still it is saying the exception is unhandled ``` var task = Task.Factory.StartNew(() => DoPrintConfigPage(serial)) .ContinueWith(tsk => { MessageBox.Show("something broke"); },TaskContinuationOptions.OnlyOnFaulted); ``` then in my `DoConfigPage` I added another try catch. In this catch is now where it is crashing and saying the exception being thrown was unhandled, what am I missing? ``` private void DoPrintConfigPage(string serial) { try { //call the print function } catch (Exception ex) { throw ex; //it is crashing here and saying it is unhandled } } ``` I also tried what Eric J. suggested with the same results ``` var task = Task.Factory.StartNew(() => DoPrintConfigPage(serial)); try { task.Wait(); } catch (AggregateException ex) { MessageBox.Show("something broke"); } ```

Original source