0

I'm trying to catch a "nested" or "encapsulated" custom error (I504Error) in my code. I know this normally isn't best practice, but it should work for my use case as the error is very specific. I'm trying to get the try/catch block to catch the I504Error in my Main method but it doesn't catch it, even though it's getting called from inside the try/catch block. My program just stops where I'm throwing the error. What am I doing wrong here?

// Custom Error Handler
public class I504Error : Exception
{
    public I504Error()
    {
    }
}

// Classes

public abstract class AbstractIternetThing
{
    public abstract void DoSomething();
}

public class IternetThing : AbstractIternetThing
{
    public override void DoSomething()
    {
        // bunch of other stuff
        if (iternetThingWorkedProperly == false)
        {
            // Program stops here, doesn't get caught by the try/catch block in Program.Main()
            throw new I504Error();
        }
    }
}

// Main script
class Pogram
{
    static void Main(string[] args)
    {
        List<Task<AbstractIternetThing>> programThreads = new List<Task<AbstractIternetThing>>();
        IternetThing iThing = new IternetThing();

        try
        {
            for (int wantedThread = 0; wantedThread < 5; wantedThread++)
            {
                Task<AbstractIternetThing> iThingTask = new Task<AbstractIternetThing>(() => iThing.DoSomething());
                iThingTask.Start();
            }
        }
        // The Error should get caught here, but it doesnt?
        catch (I504Error)
        {
            // Do something else
        }
    }
}
Alex McLean
  • 2,524
  • 5
  • 30
  • 53

1 Answers1

2

It is because you have it in a Task which is on a separate asynchronous execution path. Consider using async-await. Then the compiler will rewrite your code to make it work as you expect.

Daniel A. White
  • 187,200
  • 47
  • 362
  • 445