在控制台应用程序中使用try{..}catch{..}

本文关键字:try catch 控制台 应用程序 | 更新日期: 2023-09-27 18:14:26

我想请您解释一下异常系统是如何在下面这段代码中工作的:

    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()吗?

@EDIT:

里面的代码很复杂,可能需要几页。我可以告诉你,我在里面做了多个异步操作,比如下载文件、接收数据包等。换句话说,在循环中还创建了其他线程。

@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);
    }

在控制台应用程序中使用try{..}catch{..}

try块内的代码只要不抛出异常就会执行。如果在try块中抛出异常,下面的代码将不会执行,它将跳转到catch块。

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块中开始新的线程。如果你启动任何新线程或者使用任务并行库或plinq,你可能会得到这样的东西。

但是很难检查调试被注释取代的代码