我正在使用.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
块,但似乎并非如此。.所以有人可以建议我如何捕获在内部引发的异常异常块?
答案 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!!!