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

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


繁星点点滴滴
浏览 144回答 3
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.    }}

MM们

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

慕盖茨4494581

使用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    }}然后,您希望发生的唯一例外是写入文件失败,您需要按照应用程序的要求进行处理(权限问题的处理方式应与无效的二进制数据、损坏的流等不同)。
打开App,查看更多内容
随时随地看视频慕课网APP