簡體   English   中英

如何檢查函數是否在C#中引發異常?

[英]How to check if a function throws an exception in 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();
}

您在這里有很多選擇:

  • 通常使用Try...模式(如TryParse完成此操作。

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

我認為您可以使其更簡單:

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

這樣,如果您的GetFileNames方法引發了異常,則不會調用DoThisOtherMethod(),因為您的代碼將直接進入Exception塊。 否則,如果未引發任何異常,則您的代碼將在GetFileNames方法之后調用DoThisOtherMethod。

根本的問題是,您無法處理異常時就嘗試這樣做。

如果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();
}

您無法在C#中執行此操作。

與您所描述的最接近的是用Java實現的“檢查的異常”。 在這種情況下,該函數將聲明它拋出一些異常,如下所示:

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

編譯時,您可能需要將其封裝在TryCatch塊中,或者以相同的方式在函數中傳播它,以解決此問題。

在c#中,將函數封裝在TryCatch塊中,並在出現故障的情況下使用其他函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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