C# 我可以’;抓不到

C# 我可以’;抓不到,c#,serial-port,ioexception,C#,Serial Port,Ioexception,我有一个与USB-GPS通话的应用程序。如果没有什么不寻常的事情发生,这就是一种魅力。但我有一个大问题。如果USB被拔出,我的程序(有时)会崩溃。我在需要它们的地方试过了,但是这个东西没有被抓住。我刚得到“设备无法识别命令”,程序就停止了。以下是启动端口的代码: public LatLongFromGPS(Form1 parent) { this.parent = parent; String port; this.SPor

我有一个与USB-GPS通话的应用程序。如果没有什么不寻常的事情发生,这就是一种魅力。但我有一个大问题。如果USB被拔出,我的程序(有时)会崩溃。我在需要它们的地方试过了,但是这个东西没有被抓住。我刚得到“设备无法识别命令”,程序就停止了。以下是启动端口的代码:

        public LatLongFromGPS(Form1 parent)
    {
        this.parent = parent;
        String port;
        this.SPort = new SerialPort(port, 4800);
        this.SPort.ReadTimeout = 500;
        this.SPort.DataReceived += new SerialDataReceivedEventHandler(dataReceived);
    }

    public bool checkIfPortsOpen()
    {
        return (this.SPort.IsOpen);
    }

    public void openPort()
    {
        try
        {
            if (!this.SPort.IsOpen)
            {
                this.SPort.Open();
            }
        }
        catch(Exception ex)
        {
            parent.LoggIt.WriteLogg("OPENPORT " + ex.ToString(), Logger.LoggType.Debug);
        }
    }

    public void dataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            if (SPort.IsOpen)
            {
                String GPGGAString;
                Thread.CurrentThread.Join(200);
                buffert = new char[this.SPort.BytesToRead];
                this.SPort.Read(buffert, 0, buffert.Length);
                GPGGAString = findStringFromGPS();
                if (GPGGAString != null)
                {
                    getLatitudefromString(GPGGAString);
                    getLongitudefromString(GPGGAString);
                    getTimeFromString(GPGGAString);
                    this.newData = true;
                }
            }
        }
        catch(Exception ex)
        {
            parent.LoggIt.WriteLogg("GPSERROR    " + ex.ToString(), Logger.LoggType.Debug);
        }
    }
然后我把它放在计时器里检查信息

if (this.LatLong.newDataReceived())
   {
        //DOING STUFF
   }

if (!this.LatLong.checkIfPortsOpen())
       this.LatLong.openPort();
有人对如何阻止撞车有什么建议吗

[编辑]堆栈:

at System.IO.Ports.InternalResources.WinIOError(Int32, System.String)

at System.IO.Ports.InternalResources.WinIOError()

at System.IO.Ports.SerialStream.Dispose(Boolean)

at System.IO.Ports.SerialStream.Finalize()

我不完全确定它是否适用于这里,但有一些机制可以捕获appdomain级别的整体崩溃-


(不是关于其他事件的部分,例如ThreadException-根据情况,这些事件可能需要自己的处理程序)

尽管不是最佳做法,但顶级异常处理可能会解决您的问题。请参阅示例。

“catch”可能是言过其实了;如果你很快的话,你可以记录它们,但通常在那个阶段它是终端,你的进程就要结束了。在我看来,异常好像发生在工作线程上;屏幕上出现的异常的
.StackTrace
是什么?(可能在一个丑陋的错误框中)您是不是被
parent.LoggIt.writeLog(“GPSERROR”
line”写入日志的错误?您在使用它之前是否设置过
port
?我会附加调试器并启用中断异常,这样您就可以确定哪里出了问题。
IOException
将被捕获(异常)因此,问题不在于
dataReceived
回调。不,调试程序找不到它。只获取IOException,与“正常”崩溃不同。我在主帖子中添加了堆栈!记录器没有拾取它,因为捕获没有。。。