gpt4 book ai didi

c# - 正确处理文件流和二进制流以及处理文件流

转载 作者:行者123 更新时间:2023-11-30 14:37:56 27 4
gpt4 key购买 nike

事实上,我尝试对我的代码进行防错,但最终让它看起来很乱。

我设置了一个函数来读取某种类型的文件。我希望函数在出现问题时返回 false,如果一切正常则返回 true。我无法弄清楚如何构建所有内容。

我有一个尝试打开文件流的初始 try-catch block 。不过在那之后,我在读取过程中进行了某些其他检查,例如文件大小和某些偏移量的值。我设置它的方式是使用 if else 语句。如:

if(condition){

}
else{
MessageBox.Show("There was an error");
br.Dispose();
fs.Dispose();
return false;
}

...br 是二进制读取器,fs 是文件流。有很多这样的 block ,把同样的东西写这么多次似乎是不好的做法。首先想到的是将整个事情包装在一个 try-catch 语句中并抛出异常,而不是使用 if else block 。我记得在阅读有关 try-catch 语句的文章时,有它们很好,但不要用它们包装所有内容。老实说,我仍然不完全理解为什么将所有内容都包装在 try catch 语句中是一种不好的做法,因为它们只有在出现错误时才会起作用,在这种情况下程序无论如何都会出错......

此外,我是否必须关闭二进制阅读器和文件流,或者关闭一个会关闭另一个吗?有什么方法可以在不丢弃它们的情况下使用它们吗?

最佳答案

如何使用 using 关键字?这将您对 IDisposable 的使用包装在 try - finally block 中;

bool success = true;

using(var fs = new FileStream(fileName, FileMode.Create)))
using(var br = new BinaryReader(fs))
{
// do something
success = result;
}

return success;

嵌套的 using block 将确保文件流和二进制读取器始终正确关闭和处理。

您可以阅读 more about using in MSDN .它使 IDisposable 的使用更加简洁,不再需要显式异常处理。

关于您的声明:

I remember when reading about try-catch statements that it's good to have them, but not to wrap everything with them.

我总是使用一个简单的规则,即如果我无法处理特定代码块中的异常并从中恢复,则不要 try catch 它。允许异常将堆栈“冒泡”到更容易捕获它的位置。使用这种方法,您会发现不需要添加很多 try-catch block ,您会倾向于在与服务(例如文件系统、网络等...)集成时使用它们,但您的业务逻辑几乎总是没有异常处理机制。

关于c# - 正确处理文件流和二进制流以及处理文件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8692386/

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