2015-11-19 24 views
22

以下是MSDN, try-catch (C# Reference)C# - 嘗試/謂語表達趕上

catch (ArgumentException e) if (e.ParamName == "…") 
{ 
} 

採取了一個例子,他們也說

使用捕捉參數是一種方式來過濾要處理的異常。您還可以使用謂詞表達式來進一步檢查異常以決定是否處理它。如果謂詞表達式返回false,則繼續搜索處理程序。

異常過濾器優於捕捉和重新拋出(下面解釋),因爲過濾器不會損壞堆棧。如果稍後的處理程序轉儲堆棧,您可以看到異常最初來自哪裏,而不僅僅是最後一次拋出的地方。異常過濾器表達式的常見用法是日誌記錄。您可以創建一個總是返回false的謂詞函數,該函數也會輸出到日誌中,您可以在異常發生時記錄它們,而無需處理它們並重新拋出。

我的代碼:

static bool LogFunction(System.Exception ex) 
{ 
    System.Console.WriteLine("Writing to logfile: {0}", ex.Message); 
    return false; 
} 

static void Main(string[] args) 
{ 
    try 
    { 
     throw new System.ArgumentException("The exception message..."); 
    } 
    catch(System.Exception ex) if (LogFunction(ex)) 
    { 
     System.Console.WriteLine("This will not be executed, ever!"); 
    } 
    catch(System.ArgumentException ex) 
    { 
     // .... 
    } 
} 

現在,編譯器不會編譯這個(CSC.EXE),給予以下錯誤信息:

error CS1003: Syntax error, 'when' expected 

編輯:編譯器提高了錯誤行

error CS1003: Syntax error, 'when' expected 

我在做什麼錯?

謝謝。

編輯:我向MSDN提交了反饋,指出文檔中的錯誤。

+2

捕獲過濾器邏輯僅作爲VS2015的一部分提供。這是你使用的版本嗎? – AWinkle

+2

據我記得,如果被替換'時'關鍵字嘗試交換,如果到 – MajkeloDev

+0

我正在編譯通過'開發人員命令提示符VS2015',所以是的。我有Visual Studio 2015社區。 – jensa

回答

22

這是MSDN網站上的錯誤。如編譯器所示,您應該使用when而不是if

+0

是否有語言規範可用於具有此功能的C#版本? – recursive

+0

謝謝,它工作!我想有人應該指出MSDN的傢伙。 – jensa

+0

@recursive看起來最新版本的規範是C#5.0 –