c# - FileStream 在 try and catch 中,关闭读取器有多重要?

标签 c# try-catch

当出现异常时,我想确保在创建阅读器后关闭阅读器。所以我想在这个 try and catch 中包含一个 finally 括号。但是我不能在 finally 括号中关闭它,除非我在 try 括号的外面声明了读者。但是,如果我这样做,我将不会在创建阅读器时捕捉到任何异常。我不确定是否关闭阅读器有多重要。

XmlSerializer xmlSr = new XmlSerializer(typeof(List<ProjectObject>));
try
{
    FileStream reader = new FileStream(mTextFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
    List<ProjectObject> addProjects = (List<ProjectObject>)xmlSr.Deserialize(reader);
    mSharedDriveLocalProjects = addProjects;
    reader.Close();
}
catch
{
    MessageBox.Show("Failed to load XML file");
}

以上是我的代码。是不是这样更好?

XmlSerializer xmlSr = new XmlSerializer(typeof(List<ProjectObject>));
FileStream reader = new FileStream(mTextFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
try
{
    List<ProjectObject> addProjects = (List<ProjectObject>)xmlSr.Deserialize(reader);
    mSharedDriveLocalProjects = addProjects;
}
catch
{
    MessageBox.Show("Failed to load XML file");
}
finally
{
    reader.Close();
}

最佳答案

Using Statement就是为了解决这些困境

 XmlSerializer xmlSr = new XmlSerializer(typeof(List<ProjectObject>));
 using(FileStream reader = new FileStream(mTextFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
 {
     try
     {
         List<ProjectObject> addProjects = (List<ProjectObject>)xmlSr.Deserialize(reader);
         mSharedDriveLocalProjects = addProjects;
     }
     catch
     {
         MessageBox.Show("Failed to load XML file");
     }
}

在 using 语句中声明和创建的任何一次性对象都在 block 的导出处处理(调用对象的 dispose 方法,该方法通常负责清理所有内容,包括文件的关闭)

请注意,using 语句类似于 try/finally,因此,如果您想捕获异常并向用户显示一条友好的错误消息或将其记录在某处,您仍然需要在您的代码周围显式准备一个 try/catch block 代码。

关于c# - FileStream 在 try and catch 中,关闭读取器有多重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35300006/

相关文章:

c# - asp.net Textbox Textmode Number,只允许数字

c# - .Net Framework 4.5 中数组的 MaxSize

c# - 作为内联 C# 添加页眉和页脚到电子邮件

node.js - 无法理解为什么 try and catch 在 mongoose 中没有按预期工作

c++ - 捕获 "Access violation reading location 0x00000000"异常

c# - 如何在 C# 中将递归对象转换为集合?

c# - 从大文件中读取 JSON 对象

python - 如何将 Python 脚本转换为 Lua 脚本?

java - 扫描仪变量在 try-catch block 之外不起作用

c# - 继续使用 catch block 中设置的值的不良做法?