Перехват нескольких исключений в консольном приложении с помощью одного блока try{...}catch{...}

Я хотел бы попросить вас объяснить мне, как работает система исключений в следующем фрагменте кода:

    static void Main(string[] args)
    {
        try
        {
            //Code which throws exceptions from time to time and runs in a loop
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        Console.ReadKey();
    }

Я заметил кое-что, что удивило меня. Когда выдается исключение, код внутри блока try{...} все еще выполняется и может выдать еще больше исключений, которые будут напечатаны в окне консоли. Разве код внутри цикла не должен завершить свое выполнение и в конце "перейти" к Console.ReadKey()?

@РЕДАКТИРОВАТЬ:

Код внутри сложен и займет несколько страниц. Я могу сказать вам, что я выполняю несколько асинхронных операций внутри, например, скачивая файлы, получая пакеты и т. Д. Другими словами, существуют другие потоки, которые создаются в цикле.

@EDIT2: предположительно, это код, ответственный за поведение:

public SomeConstructor(Socket server)
    {
        _pb = new PacketBuilder(server, c);

        SocketWrapper sw = new SocketWrapper(server, Globals.recvBufferSize);
        sw.Socket.BeginReceive(sw.Buffer, 0, Globals.recvBufferSize, SocketFlags.None,PacketReceiveCallback, sw);

        _pi = new PacketInterpreter(this, c);
    }

    private void PacketReceiveCallback(IAsyncResult iar)
    {
        SocketWrapper sw = iar.AsyncState as SocketWrapper;
        int bytesReceived = sw.Socket.EndReceive(iar);

        _pi.Interpret(sw.Buffer, 0, bytesReceived);

        if (bytesReceived > 0)
            sw.Socket.BeginReceive(sw.Buffer, 0, Globals.recvBufferSize, SocketFlags.None, PacketReceiveCallback, sw);
    }

2 ответа

Код внутри блока try будет выполняться до тех пор, пока он не выдаст исключение. Если исключение выдается в вашем блоке try, следующий код не будет выполнен, и он перейдет к блоку перехвата.

static void Main(string[] args)
{
    try
    {
        //Code which throws exceptions from time to time and runs in a loop
        Console.WriteLine("Line 1");

        throw new Exception("Sample Exception"); // your code will stop here and following line will not prine.
        Console.WriteLine("This line will not print");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    Console.ReadKey();
}

Единственная причина, по которой я могу подумать, почему у вас такое поведение, заключается в том, что вы запускаете новые потоки внутри блока try. Поэтому, если вы запускаете какие-либо новые потоки или используете библиотеку Parallell Task или Plinq, вы можете получить что-то подобное.

Но действительно сложно проверить-отладить код, который был заменен комментарием...

Другие вопросы по тегам