[英]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 .. catch
塊try .. 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.