簡體   English   中英

不拋出異常(在Win7中?)

[英]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.");
        }

哪個會很棒。 除以下情況外:

  • 我在VS 2008的Win 7環境中構建了這個。
  • 我在Win7 / XP中測試過
  • 在Win7中運行時 - 異常不會拋出。 我甚至可以看到它應該有,因為我顯示它加載到應用程序的列表框中的數據,但加載后列表是空白的。 如果我逐行遍歷代碼到有壞數據的項目,我可以看到異常拋出。 但是如果不是逐行調試,則不在Debug中,也不在Release中調試。
  • 在XP中,異常按預期拋出。

這顯然是一個問題,如果應用程序在數據存在問題的狀態下運行但沒有向用戶顯示,並且如果數據存在問題,則不應該讓用戶得到這么多。

為什么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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM