首页 > 解决方案 > 我如何捕获异常块内引发的异常

问题描述

我正在开发一个 .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将到达最后一个块,但似乎情况并非如此..所以任何人都可以建议我如何捕获在 Exception 块内引发的异常?

标签: c#.net

解决方案


你应该注意到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.
    }
}

推荐阅读