[英]Exception not throwing (in Win7?)
我有應用程序讀取文本文件中的數據。 最近我意識到我應該為文本文件中的數據做一個數據檢查,看看我是否能正確顯示/處理它。
基本上目前所有檢查程序都會查看數據是否格式正確,即double是double,int是int等等。如果不是,我會拋出異常。
像這樣:
private static string CheckDouble(string doublevar)
{
double tryParseDoubleResult;
var tryParseDouble = double.TryParse(doublevar, out tryParseDoubleResult);
if (tryParseDouble)
{
return doublevar;
}
throw new Exception("Invalid data found. Cannot open.");
}
哪個會很棒。 除以下情況外:
這顯然是一個問題,如果應用程序在數據存在問題的狀態下運行但沒有向用戶顯示,並且如果數據存在問題,則不應該讓用戶得到這么多。
為什么Win7中沒有例外?
編輯:
我想也許這個例外被吞噬了,因為我只是看到它逐行逐行時拋出。 檢查它是否被吞下的最佳方法是什么? 只需按照我的應用程序執行並尋找Try塊? (當它在XP中正常拋出時仍然沒有意義,但是...)
作為額外的一點,我有一個帶3個按鈕的啟動窗口。 一個是打開按鈕。 從這里我打開要處理的數據文件。
var w = new Window1();
w.Show();
//此時,window1中所有tabitems的FormLoad執行,異常應該拋出。 事實上,當它發生時,沒有任何東西被拋出,但執行從異常應拋出的行跳到Close()下面的行; 並且下一個窗口加載但是由於數據引發的異常,因此三個屏幕中的一個是空的。
Close();
EDIT1:
拋出異常的類是Singleton,我不知道這是否與問題有關...
EDIT2:
經過幾天的進一步調查,我仍然不知道為什么會這樣。 解決問題:是的我知道我應該創建自己的自定義異常類。 但這並沒有改變這里發生的事情。 我找不到嘗試抓住更高的堆棧。 我有一個異常處理程序,如果在應用程序中拋出異常,它就是Environment.Exit(1);
然后將異常記錄到文本文件中。 我完全取消了異常處理程序,但仍然看到了相同的行為。
這不是由於區域設置問題...
無論如何,除此之外,這仍然無法解釋為什么在XP中按預期拋出異常(並且應用程序崩潰並將異常記錄到文件中),而在Win7中 - 忽略異常並繼續執行。
首先,你真的應該拋出自己的例外。 System.Exception是所有異常繼承的頂級異常。 例如,考慮創建一個DataFormatException - 並拋出它。
接下來,聽起來你可能正在捕獲System.Exception某人在堆棧中較低的吞下這個異常。 同樣,如果您只在該線程的堆棧中的最低點捕獲System.Exception,並將其用作整個應用程序的catch-all,那將是理想的。 在代碼中的其他位置,您應該捕獲預期會發生的異常。 例如,您的方法的調用者應該只嘗試捕獲DataFormatException和ArgumentException(如果“doublevar”為null或為空,則應該拋出)。 例如:
/// <summary>
/// Checks to see if the specified value is a double.
/// </summary>
/// <param name="valueToCheck">The value to check.</param>
/// <exception cref="ArgumentException">If <paramref name="valueToCheck"/>
/// is null or empty.</exception>
/// <exception cref="DataFormatException">If <paramref name="valueToCheck"/>
/// could not be parsed as a valid double.</exception>
private static double CheckDouble(string valueToCheck)
{
if (string.IsNullOrEmpty(valueToCheck))
throw new ArgumentException("Argument 'valueToCheck' cannot be null or empty.", "valueToCheck");
double result;
if (double.TryParse(valueToCheck, out result))
{
return result;
}
throw new DataFormatException("Value '" + valueToCheck + "' could not be parsed as a double.");
}
希望有幫助......
我假設你在這里使用tryparse並重新拋出異常只是為了證明try parse沒有按預期工作...為什么不嘗試在if if語句中添加一個Debug.Print以查看你得到的內容。
此外,請確保沒有從另一個使用吞噬異常的try / catch塊包裝此代碼的函數調用此代碼
當您在調試模式中單步執行時,您可以看到異常被拋出,對吧? 之后會發生什么? 也就是說,在throw new Exception()
行之后,當你按下F10時,你最終會在哪里結束? 這就是吞噬異常的地方。
如果你最終在某個地方的框架代碼中,這意味着你需要手動添加一個try ...自己捕獲處理文件的代碼:
void Form_Load(object sender, EventArgs e)
{
try
{
ParseFile();
}
catch(Exception ex)
{
MessageBox.Show("The file was not valid: " + ex.Message);
}
}
您的計算機很可能在區域設置上有所不同。 例如,千位/小數分隔符在國家/地區之間有所不同,例如“1,000.00”與“1.000,00”, DateTime
格式不同等。嘗試使用Parse / TryParse / ToString重載,明確指定CultureInfo
並避免默認為計算機設置,可能使用CultureInfo.InvariantCulture
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.