c# - 如果您所做的只是抛出捕获的异常,您是否需要一个 catch 块?
问题描述
我发现了一些他们想要传播异常的代码,但他们想事先运行一些清理代码,所以很自然地使用Try
/ Catch
/ Finally
。但是......他们实际上并没有做任何事情,只是转发它。在这些情况下,我的理解是不需要 catch 块,但有人说它实际上是。我不确定那些这样做的人是否正确。
具体来说,微软关于 Try-Catch 的文档说如下......
在已处理的异常中,保证运行关联的 finally 块。但是,如果异常未处理,finally 块的执行取决于异常展开操作的触发方式。反过来,这取决于您的计算机的设置方式。
电脑跟它有什么关系?除了 using 的异常(没有双关语)FailFast
,调用它的更进一步的 try-catch 块不会正确捕获此异常吗?如果这就是他们的意思,那真是一种尴尬的说法!
不过,我认为这证明catch{ throw; }
不需要,对吗?
考虑以下代码...
public static BitmapImage MakeBitmapImage(byte[] bytes){
var ms = new MemoryStream(bytes);
try{
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = ms;
bitmapImage.EndInit();
return bitmapImage;
}
catch{
throw;
}
finally{
ms.Close();
ms.Dispose();
}
}
如果无法加载位图,难道不能像这样重写(没有catch
块)来传播吗?
public static BitmapImage MakeBitmapImage(byte[] bytes){
var ms = new MemoryStream(bytes);
try{
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = ms;
bitmapImage.EndInit();
return bitmapImage;
}
finally{
ms.Close();
ms.Dispose();
}
}
解决方案
我不完全确定作者的意思,但我有根据的猜测是“您的计算机是如何设置的”。真正的意思是“你的架构如何处理展开”。这在 ARM 和 x86 中可能有所不同。
不需要 catch 块,try 块也不需要:如果他们试图保证清理,他们可以只使用一个using
语句,因为即使有异常也可以工作。
推荐阅读
- reactjs - 将我的 React 网站发布到 GitHub 页面只会产生一个空白页面
- rust - 根据 Rust 中的值确定给出哪个命令行参数(例如使用 Clap)
- windows - 在两个单独的可执行文件之间拦截命令
- visual-studio-code - 如何格式化 Visual Studio Code 的下划线
- laravel - Laravel 日历预定日期
- mysql - 在客户端登录期间将密码设置为从服务器端过期时,如何阻止客户端用户使用 MySQL 命令?
- python-3.x - 如何在请求缓存中设置缓存时间?
- java - 如何使用我自己的方法在 javax.swing 中进行事件监听
- excel - 如何防止用户窗体覆盖工作表上的控件?
- typescript - 获取 firebase 文档时处理错误