在控制台应用程序中使用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块内的代码只要不抛出异常就会执行。如果在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,你可能会得到这样的东西。
但是很难检查调试被注释取代的代码