2015-06-02 74 views
1

我有一個應用程序(已發佈)和一個NullReferenceException,它很少會彈出給用戶,但我想照顧它。我查看了堆棧和其中的方法,可以找到它不會發生的具體位置(這是一個相當大的方法/算法)。現在我只是用try/catch來圍繞這個調用本身,但是如果我能弄清楚這個情況,我想更好地處理它。
問題是,就我所知,NRE並沒有提供關於代碼中特別引起它的線索。是否有辦法獲得行號或任何其他可能暗示原因的信息?NullReferenceException位置信息?

+2

看到這個:http://stackoverflow.com/questions/628565/display-lines-number-in-stack-trace-for-net-assembly-in-release-mode –

+0

你可以嘗試單元測試並運行所有可能的(和不可能的)參數值... –

回答

2

一些提示:

  1. 如果您部署符號文件(.PDB)一起可執行/ DLL文件,然後將堆棧跟蹤你得到的將包括行號。
  2. 它也可以幫助將您的方法分解成更小的部分,以便您的堆棧跟蹤讓您更好地瞭解發生錯誤時的位置。
  3. 您可以通過檢查輸入的空值或其他無效值來開始每種方法,因此您快速失敗帶有有意義的消息。

    private void DoSomething(int thingId, string value) 
    { 
        if(thingId <= 0) throw new ArgumentOutOfRangeException("thingId", thingId); 
        if(value == null) throw new ArgumentNullException("value"); 
        ... 
    } 
    
  4. 可以圍繞每種方法有一個例外包裝以提供在它的方式堆棧跟蹤每個級別的詳細信息。

    private void DoSomething(int thingId, string value) 
    { 
        try 
        { 
         ... 
        } 
        catch (Exception e) 
        { 
         throw new Exception("Failed to Do Something with arguments " + 
          new {thingId, value}, 
          e); // remember to include the original exception as an inner exception 
        } 
    }