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然后冒泡到没有哪里对吧?我知道这里有同样的问题,我只想在这个例子中向自己重申这是真的.
谢谢
从catch块中抛出(或重新抛出)的异常不是由同一个块处理catch,而是由链上的下一个异常处理程序处理.如果没有其他处理程序(并且没有适当的全局异常处理程序来正常处理异常),则应用程序将终止.
关于你的附注,throw保留了异常上的调用堆栈,但是一个异常的重新抛出throw ex似乎来自于GetStream().