2013-02-19 23 views
6

Tôi có một ứng dụng nói chuyện với một USB-GPS. Nó hoạt động như một sự quyến rũ nếu không có gì ngoài hạnh phúc bình thường. Nhưng tôi có một vấn đề lớn. Nếu USB bị kéo ra, chương trình của tôi (một số lần) bị treo. Tôi đã thử/Catch nơi tôi cần chúng nhưng IOExeption này không bị bắt. Tôi chỉ nhận được "Thiết bị không nhận ra lệnh" và chương trình dừng lại. Dưới đây là đoạn code mà bắt đầu vào cổng:IOException Tôi không thể bắt được

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

Sau đó, tôi có điều này trong một Timer để kiểm tra các thông tin

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

if (!this.LatLong.checkIfPortsOpen()) 
     this.LatLong.openPort(); 

Bất cứ ai có bất cứ đề nghị làm thế nào để ngăn chặn tai nạn?

[EDIT] Các stack:

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() 
+0

nghe có vẻ như tôi là ngoại lệ đang xảy ra trên một chuỗi công nhân; '.StackTrace' của ngoại lệ xuất hiện trên màn hình là gì? (có thể trong một hộp lỗi xấu) –

+0

Có phải bạn đã viết sai lỗi để ghi nhật ký bằng 'parent.LoggIt.WriteLogg (" GPSERROR "' line? – Artemix

+0

Bạn đã bao giờ đặt 'cổng' trước khi sử dụng nó chưa? –

Trả lời

1

Tôi không hoàn toàn chắc chắn nếu nó áp dụng ở đây, nhưng có những cơ chế để bắt tai nạn tổng thể ở cấp appdomain - http://msdn.microsoft.com/en-GB/library/system.appdomain.unhandledexception.aspx

(không phải là phần trên các sự kiện khác, ví dụ ThreadException - những điều này có thể cần xử lý riêng của họ tùy thuộc vào tình hình)

+0

"catch" là có lẽ đã nói quá rõ; bạn có thể * đăng nhập * chúng nếu bạn đang nhanh chóng, nhưng thường nó là thiết bị đầu cuối ở giai đoạn đó và quá trình của bạn sắp chết –