gpt4 book ai didi

c# - 关于抛出和异常冒泡

转载 作者:行者123 更新时间:2023-11-30 13:41:54 27 4
gpt4 key购买 nike

我的问题是关于抛出和异常冒泡。我正在四处搜索文件锁定和 C#,并尝试弄乱某人的代码,这让我质疑我对抛出和异常冒泡的了解程度。

Here是线程的链接。

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

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

GetStream(处理IOException)文件锁定扔异常将在 GetStream 中处理

但是,当我运行它时,它似乎并没有冒泡,而是暂停了我的应用程序。我在这里遗漏了什么吗?

旁注:为了让我了解 throw 和 throw ex 之间的区别,如果使用了 throw ex,异常将显示为源自 GetStream,然后冒泡到没有地方对吗?我知道这里有同样的问题,我只是想在这个例子中向自己重申这是真的。

谢谢

最佳答案

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

关于您的旁注,throw 保留了异常的调用堆栈,但是 throw ex 重新抛出的异常似乎起源于 GetStream()

关于c# - 关于抛出和异常冒泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4065893/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com