2016-02-17 26 views
-2

我使用第三方組分(SendGrid)和該組分拋出異常:.NET異常與錯誤字段

 var myMessage = new SendGridMessage(); 
     myMessage.AddTo(element.Receiver); 
     myMessage.From = new System.Net.Mail.MailAddress(element.SenderEmail, element.SenderName); 
     myMessage.Subject = element.Subject; 
     myMessage.Text = element.Body; 
     myMessage.Html = element.Body; 

     string sendGridApiKey = ConfigurationManager.AppSettings["SendGridApiKey"]; 
     var transportWeb = new SendGrid.Web(sendGridApiKey); 
try 
{ 
    await transportWeb.DeliverAsync(myMessage); 
} 
catch (Exception ex) 
{ 
} 

調試器說,即「EX」具有字段的錯誤有錯誤的陣列和ex.Message = '錯誤的請求檢查Errors以獲取API返回的錯誤列表。'

但是,如果我嘗試寫一些東西:

var x = ex.Errors; 

它說

嚴重性代碼說明項目文件的線路抑制狀態 錯誤CS1061「例外」不包含一個定義爲「錯誤」並且沒有擴展方法'錯誤'接受類型'異常'的第一個參數可以找到(你是否缺少使用指令或程序集引用?)SendGridEmailService

它是如何實現的(據我所知,有一個來自未知名稱空間的異常)如何知道這個異常?

+2

把一個斷點到然後用鼠標檢查語句的確切類型。 – CodeNotFound

+0

@OlegSh你將需要發佈完整的代碼塊,你有這個代碼的位置..也錯誤信息告訴你什麼是錯誤.. – MethodMan

+0

@MethodMan,但我寫了錯誤信息! –

回答

1

異常可能不包含錯誤字段,所以你得到編譯錯誤。 ex本身就是Exception的一些子類的一個實例,但是編譯器並不知道它是什麼,它只知道它可以分配給Exception,因爲你聲明瞭「Exception ex」。因此,解決方案是捕獲更具體的異常,這也是一種很好的做法,例如通過捕獲一般異常,捕獲所有異常,這是您通常不需要的異常。

如果你想在運行時得到ex的實際類型,你可以使用ex.GetType(),但你應該能夠在調試器中看到它。

+0

ex.GetType()。謝謝,正是我想要的。 –

+0

好吧然後!很高興我能幫上忙。 –

+1

但調試器的方法確實應該起作用。請參閱@Scott Chamberlain http://i.stack.imgur.com/bUsQv的截圖。png –

2

我發現了一個小的搜索後,這個網上,看起來像你想InvalidApiRequestException

try 
{ 
    await transportWeb.DeliverAsync(myMessage); 
} 
catch (InvalidApiRequestException ex) 
{ 
} 

如果你仍然想嘗試和捕獲所有異常,你可以這樣做:

try 
{ 
    await transportWeb.DeliverAsync(myMessage); 
} 
catch (Exception ex) 
{ 
    var ex2 = ex as InvalidApiRequestException; 
    if(ex2 != null) 
    { 
     var x = ex2.Errors; 
    } 
} 

InvalidApiRequestException Source

發現日期: http://www.rolandocr.com/2015/06/how-to-using-sendgrid-csharp-library-and-deliverasync-method-error-handling-and-async-pattern/#sthash.1mVXMDWh.dpbs

+0

謝謝,但我會知道一種方法,當我可以從代碼 –

+0

找到原始異常本身,你可以改述你的評論嗎? –

+0

如果您確實想要捕獲所有異常,則可以使用多個catch塊執行此操作。你的方式是......不太好,恕我直言。 即'嘗試 {...} 趕上(InvalidApiRequestException E) { ... } 趕上(例外前){ ... } ' –

2

你一定要看到什麼是Exception的運行時類型和投ex該類型或定義catch這樣的異常類型,例如,如果如果ErrorsException類型的異常:

try 
{ 
    await transportWeb.DeliverAsync(myMessage); 
} 
catch (ErrorsException ex) 
{ 
    var errors = ex.Errors 
} 

classs ErrorsException : Exception 
{ 
    public string[] Errors { get; set; } 
} 
+0

「你必須看看Exception的運行時類型是什麼,並把它轉換爲該類型」 - 我想找到辦法:) –

+1

@Oleg Sh:調試你的代碼,當VisualStudio的Locals窗口中捕獲異常時,你可以看到異常的類型或添加'ex'變量來觀察窗口。或者CodeNotFound在評論中說,通過使用調試器將鼠標移到ex變量 –

+1

@OlegSh上。當你在調試器中查看'ex'時[ex'的實際類型將在一對'{}'](http://i.stack.imgur.com/bUsQv.png)中, –