我如何捕获异常块内引发的异常

时间:2018-07-03 22:53:04

标签: c# .net

我正在使用.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块内引发了异常,则其他两个catch块将捕获该异常,具体取决于异常类型!但是如果在catch (System.IO.DirectoryNotFoundException e)块中引发异常,则控制台将结束。现在我以为如果在catch (System.IO.DirectoryNotFoundException e)块内引发了异常,则将到达最后一个catch块,但似乎并非如此。.所以有人可以建议我如何捕获在内部引发的异常异常块?

4 个答案:

答案 0 :(得分:3)

您应该注意, 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.
    }
}

答案 1 :(得分:2)

要处理此问题,您必须在正在处理try .. catch的catch块内编写另一个DirectoryNotFoundException

答案 2 :(得分:1)

使用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
    }
}

然后,您唯一希望发生的异常是写入文件失败,您将根据应用程序的指示进行处理(权限问题应与无效的二进制数据,损坏的流等区别对待)< / p>

如果您还没有读过,可能会觉得值得一读:Best practices for exceptions

答案 3 :(得分:0)

根据您的需求,您可以尝试捕获巨大的嵌套语句。

如果您有要尝试的目的地列表,则可以执行以下操作

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!!!