C#在调用堆栈中捕获未处理的异常

时间:2016-05-27 15:40:53

标签: c# exception-handling

我有一个程序可以加载很多函数以加载文件,并且由于可能加载了损坏的文件,因此可能会出现错误。

我想尝试捕获在调用加载函数的函数中加载这些文件时抛出的任何未处理的异常。

是否可以在没有在加载过程中调用的每个函数中添加try catch的情况下执行此操作?

try {
    var loadedFile = new LoadedFile(path);
    fileList.Add(loadedFile);
}
catch (Exception e) {
    Console.WriteLine("Error Loading File");
}

2 个答案:

答案 0 :(得分:4)

是的,可能。使用try catch简单地围绕最顶层的函数调用。任何异常都会被抛出。但是你应该在它发生的函数中捕获它,并且假设你可以,在该函数内修复异常的原因。如果你不能,程序必须失败,因为它无法完成任务。

例如,如果文件已损坏,程序将失败;如果文件从另一个进程锁定它,你可以等到锁被释放(假设它被释放),然后继续或以其他方式失败。

答案 1 :(得分:1)

未处理的异常“冒泡”调用堆栈,直到它们被捕获,或者应用程序抛出未处理的异常错误。您可以在更高级别的函数中放置try...catch块,它将捕获较低级别抛出的异常。

例如:

public void CatchEmAll()
{
    try
    {
        DoSomethingExceptiony();
    }
    catch (Exception ex)
    {
        // handle the exception
    }
}

public void DoSomethingExceptiony()
{
    throw new Exception("Uh oh!");
}

在这种情况下,DoSomethingExceptiony中抛出的异常不会在该级别被捕获,而是会在调用函数CatchEmAll中冒泡,然后才会被捕获。

旁注:执行catch (Exception)捕获任何异常通常都是不好的做法。最好了解代码可以抛出什么类型的异常,并且只处理那些异常。例如,如果要加载文件,则可能会特别捕获FileNotFoundException,但不会捕获任何和所有异常。