2016-09-29 42 views
0

我已經嘗試了幾個關於如何在拋出異常時在堆棧跟蹤中保留正確行號的建議。最常見的只是抓住並拋出,但這不起作用。這裏有一些我已經嘗試過:catch/throw堆棧跟蹤丟失錯誤的行號

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     test(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
private void test() 
{ 
    try 
    { 
     int a = 1; 
     int b = 0; 
     int x = 0; 
     x = a/b; 
    } 
    catch 
    { 
     throw; 
    } 
} 

和catch塊的幾個變化。

catch (Exception) 
{ 
    throw; 
} 

catch (Exception e) 
{ 
    throw; 
} 

catch (Exception e) 
{ 
    throw e; 
} 

所有在罰球線和消息框行這些報告錯誤的 - 永遠不要對由0.1分。如果我的測試()函數內斷行,但它顯示正確的行號,但被拋出後不會。有效的唯一方法是在test()函數中沒有任何try/catch。但我當然希望能夠捕捉錯誤並重新拋出錯誤,並保持堆棧跟蹤正確。那麼這是如何完成的?

謝謝。

+0

'throw new Exception(「See InnerException」,ex);'catcher可以查看被捕獲的異常的InnerException屬性以查看原始堆棧跟蹤等 –

+0

http://stackoverflow.com/questions/22623/best-實踐捕捉和重新拋出淨例外 – hatchet

+0

實際上更接近http://stackoverflow.com/questions/57383/in-c-how-can-i-rethrow-innerexception-without-losing-stack - 跟蹤......但是很驚訝'ExceptionDispatchInfo'只在這個@hatchet中被評論。 – TylerY86

回答

0

在發佈時間,您將不會有行號,因爲從*.pdb文件中檢索到的行數包含所有編譯符號。
因此,如果您計劃在發佈/生產中獲得確切的生產線號,您必須複製pdb文件

0

最簡單的方法是簡單地刪除測試中的try catch。如果這不是一個選項,如上面的註釋中提到的那樣,您可以拋出一個新的異常,傳入舊的異常並查找實際堆棧跟蹤信息的內部異常。

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     test(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.InnerException.ToString()); 
    } 
} 

public void test() 
{ 
    try 
    { 
     int a = 1; 
     int b = 0; 
     int x = 0; 
     x = a/b; 
    } 
    catch (Exception e) 
    { 
     throw new Exception("inner exception", e); 
    } 
} 
0

TylerY86的回答爲我工作。當錯誤冒起來時,它會給出很多額外的東西,但它確實給出了適當的行#。

謝謝!