关于抛出和异常冒泡

Ily*_*lya 3 c# exception-handling

我的问题是关于抛出和异常冒泡.我正在四处搜索文件锁定和C#,我试着弄乱别人的代码,这让我怀疑我对抛出和异常冒泡有多了解.

是线程的链接.

public class FileManager
{
private string _fileName;
private int _numberOfTries;

private int _timeIntervalBetweenTries;

private FileStream GetStream(FileAccess fileAccess)
{
    var tries = 0;
    while (true)
    {
        try
        {
            return File.Open(_fileName, FileMode.Open, fileAccess, Fileshare.None); 
        }
        catch (IOException e)
        {
            if (!IsFileLocked(e))
                throw;
            if (++tries > _numberOfTries)
                throw new MyCustomException("The file is locked too long: " + e.Message, e);
            Thread.Sleep(_timeIntervalBetweenTries);
        }
    }
}

private static bool IsFileLocked(IOException exception)
{
    int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
    return errorCode == 32 || errorCode == 33;
}

// other code
Run Code Online (Sandbox Code Playgroud)

}

在上面的代码中,如果IsFileLocked返回false,则抛出重新抛出IOException.据我所知,我认为现在IOException会冒出堆栈跟踪.至少对我来说,这意味着当发生抛出时,它应该再次被catch(IOException e)捕获(显然在GetStream方法中)​​.毕竟,堆栈跟踪将是这样的:

GetStream(处理IOExceptions)IsFileLocked抛出异常将在GetStream中处理

然而,当我运行它时,它似乎不打扰冒泡,而是停止我的应用程序.我在这里错过了什么吗?

旁注:就是这样我得到了throw和throw ex之间的区别,如果使用了throw ex,那么异常就会显示源自GetStream然后冒泡到没有哪里对吧?我知道这里有同样的问题,我只想在这个例子中向自己重申这是真的.

谢谢

Phi*_*unt 9

catch块中抛出(或重新抛出)的异常不是由同一个块处理catch,而是由链上的下一个异常处理程序处理.如果没有其他处理程序(并且没有适当的全局异常处理程序来正常处理异常),则应用程序将终止.

关于你的附注,throw保留了异常上的调用堆栈,但是一个异常的重新抛出throw ex似乎来自于GetStream().