簡體   English   中英

我如何捕獲異常塊內引發的異常

[英]How i can catch an exception raised inside an Exception block

我正在.net控制台應用程序上工作,並且我有以下代碼:-

try {
    SPFile destFile = projectid.RootFolder.Files.Add(destUrl, fileBytes, false);
} catch (System.IO.DirectoryNotFoundException e) {
    SPFile destFile = projectid.RootFolder.Files.Add(destUrl, fileBytes, false);
} catch {}

現在,如果在try塊內引發了異常,則其他2個catch塊將捕獲該異常,具體取決於異常類型! 但是如果catch (System.IO.DirectoryNotFoundException e)塊內引發了異常,則控制台將結束。 現在我以為如果在catch (System.IO.DirectoryNotFoundException e)塊內引發了異常,則將到達最后一個catch塊,但似乎並非如此。.所以有人可以建議我如何捕獲在內部引發的異常異常塊?

您應該注意, try-catch絕不能成為代碼邏輯的一部分,這意味着您絕不應該使用try-catch來控制分支。 這就是為什么您很難讓異常流過每個catch塊的原因。

如果您想抓住第二個區塊,可以這樣編寫(但不推薦使用 ):

try
{
    SPFile destFile = projectid.RootFolder.Files.Add(destUrl, fileBytes, false);
}
catch (System.IO.DirectoryNotFoundException e)
{
    try
    {
        SPFile destFile = projectid.RootFolder.Files.Add(destUrl2, fileBytes, false);
    }
    catch
    {
        // Do what you want to do.
    }
}
catch
{
}

您最好不要這樣寫。 相反, 建議像下面這樣檢測文件夾是否存在:

try
{
    YourMainMethod();
}
catch (Exception ex)
{
    // Handle common exceptions that you don't know when you write these codes.
}

void YourMainMethod()
{
    var directory = Path.GetDirectoryName(destUrl);
    var directory2 = Path.GetDirectoryName(destUrl2);

    if (Directory.Exists(directory))
    {
        SPFile destFile = projectid.RootFolder.Files.Add(destUrl, fileBytes, false);
    }
    else if (Directory.Exists(directory2))
    {
        SPFile destFile = projectid.RootFolder.Files.Add(destUrl2, fileBytes, false);
    }
    else
    {
        // Handle the expected situations.
    }
}

要解決此問題,您必須在正在處理DirectoryNotFoundException的catch塊中編寫另一個try .. catchtry .. catch

使用File.Exists可能更有意義,以查看路徑是否已經存在,然后嘗試寫入文件:

string path = null;

if(!File.Exists(destUrl))
{
    path = destUrl;
}
else
{
    if(!File.Exists(destUrl2))
    {
        path = destUrl2;
    }
}

if(!string.IsNullOrWhiteSpace(path))
{
    try
    {
        SPFile destFile = projectid.RootFolder.Files.Add(path, fileBytes, false);
    }
    catch
    {
        // Something prevented file from being written -> handle this as your workflow dictates
    }
}

然后,您唯一希望發生的異常是寫入文件失敗,您將需要根據應用程序的指示進行處理(權限問題應與無效的二進制數據,損壞的流等不同地對待)

如果您還沒有這樣做,那么您可能會覺得值得一讀: 例外的最佳實踐

根據您的需求,您可以嘗試捕獲巨大的嵌套語句。

如果您有要嘗試的目的地列表,則可以執行以下操作

var destinations = new List<string>() {dest1,dest2,dest3, ...};

SPFile destFile = null;

foreach(var destination in destinations)
{
    try
    {
        destFile = projectid.RootFolder.Files.Add(destination, fileBytes, false);
        // we are working
        Console.WriteLine($"Destination Success!!: {destination}");
        break;
    }
    catch(DirectoryNotFoundException ex)
    {
         Console.WriteLine($"Destination failed : {destination} - {ex.Message}");
    }
} 

if(destFile != null)
   // do something with your destFile 
else
   // oh noez!!!

暫無
暫無

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

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