2017-06-15 58 views
1

如何檢查函數是否在c#中拋出異常?如何檢查函數是否在c#中拋出異常?

public List<string> GetFileNames() 
{ 
    try 
    { 
     // do something 
     // return something 
    } 
    catch(Exception ex) 
    { 
     // do something 
     // log something 
    } 
} 

的話,我會打電話給GetFileNames()的地方在我的代碼,但我要檢查,如果它拋出一個異常, 一樣,

var list = GetFileNames(); // can be 0 count 

if(GetFileNames() throws an error) 
{ 
    DoThisMethod() 
} 
else 
{ 
    DoThisOtherMethod(); 
} 
+0

選項1:不要在您的方法中捕捉異常,讓它冒泡並在您實際想要做出決定的塊中捕捉它。選項2:讓你的方法返回一個指示成功/失敗的布爾值。如果您需要返回值,請考慮'out'參數([文檔](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-parameter-modifier))。還有很多其他的方法, – Basic

回答

2

您在這裏有很多的選擇:

  • 這通常使用Try...模式完成,如TryParse

    bool TryGetFileNames(out List<string> fileNames) 
    
  • 您還可以返回null

0

我想你可能應該拋出異常在GetFileNames。如果您需要做類似登錄或做其他工作的事情,您可以按照您的指示在catch塊中執行此操作,但最後一行應該是throw。這就是你如何判斷一個方法是否拋出一個異常,通過讓該方法實際拋出。

如果你真的想吞下異常並返回一個空的列表,類似bool TryGetFileNames(out IList<string> fileNames)是一個選項。儘管如此,我仍然會重新考慮你的方法,因爲使用類似TryXYZ方法的東西是非常少見的事情。

0

我想你可以把它簡單:

public void ICallGetFileNames() 
{ 
    var list = new List<YourObject>(); 
    try 
    { 
     list = GetFileNames(); 
     DoThisOtherMethod(); 
    } 
    catch (Exception ex) 
    { 
     DoThisMethod(); 
    }   
} 

這樣,如果異常是由您的GetFileNames方法拋出,DoThisOtherMethod()不會被調用,因爲你的代碼直接到例外塊。否則,如果沒有拋出異常,您的代碼將在GetFileNames方法後面調用DoThisOtherMethod。

0

最根本的問題是,當你無法這樣做時,你正試圖處理異常。

如果GetFilenames無法從異常中恢復,它應該自己引發異常。這可能是通過完全忽略try/catch,或者通過捕獲,包裝和重新拋出。

public List<string> GetFilenames() { 
    try { 
     ... 
    } catch (Exception e) { 
     throw new FileLoadException("Failed to get filenames", e); 
     // Or if you don't want to create custom exceptions, perhaps use an InvalidOperationException 
    } 
} 

如果做不到這一點,如果你實際上並不需要抽象的功能,不抓在GetFilenames異常的話,那麼這樣稱呼它:

try { 
    var list = GetFilenames() 
    DoSomething(); 
} catch (Exception e) { 
    DoSomethingElse(); 
} 
0

你可以「噸在C#中做到這一點

最接近的事到你所描述的是「檢查的異常」,這是在Java中實現。在這種情況下,該函數將宣佈它拋出一些例外,像這樣:。

public void foo() throws IOException { 
    // your code 
} 

編譯時候你會被forsed通過無論是在TryCatch塊封閉該照顧的這個或傳播這個在功能相同的方式。

在c#中包含TryCatch塊中的函數,並在不正常的情況下使用不同的函數。