为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
繁星点点滴滴 2021-09-19 15:41:34
我正在开发一个 .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将到达最后一个块,但似乎情况并非如此..所以有人可以建议我如何捕获在异常块内引发的异常吗?
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超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.

    }

}


查看完整回答
反对 回复 2021-09-19
?
MM们

TA贡献1886条经验 获得超2个赞

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


查看完整回答
反对 回复 2021-09-19
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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

    }

}

然后,您希望发生的唯一例外是写入文件失败,您需要按照应用程序的要求进行处理(权限问题的处理方式应与无效的二进制数据、损坏的流等不同)。



查看完整回答
反对 回复 2021-09-19
  • 3 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信