写入文件实现
本文关键字:实现 文件 | 更新日期: 2023-09-27 18:21:12
我只想在这里学习一些关于我的代码的新东西。
我有以下函数,如果我在写入文件时遇到问题,这是优化的返回方式吗?或者有更好的方法
public static bool WriteFile(ByteBuffer data , String fileName, bool append)
{
var writer = new StreamWriter(fileName, append);
var errorVal = true;
try
{
writer.Write(data);
writer.Flush();
}
catch (Exception ex)
{
errorVal = false;
}
finally
{
writer.Dispose();
}
return errorVal;
}
如果真的想要吃掉所有异常并返回一个bool
,我宁愿这样做:
public static bool WriteFile(ByteBuffer data, String fileName, bool append)
{
using(var writer = new StreamWriter(fileName, append))
{
try
{
writer.Write(data);
return true;
}
catch (Exception ex)
{
// log the exception details; don't just eat it.
}
}
return false;
}
也就是说,如果这是我自己的代码,我可能根本不会在这里捕捉到异常,而是将其留给调用代码:
public static void WriteFile(ByteBuffer data, String fileName, bool append)
{
using(var writer = new StreamWriter(fileName, append))
{
writer.Write(data);
}
}
最好让它将异常抛出到应用程序的层架构中的顶层。
public static void WriteFile(ByteBuffer data , String fileName, bool append) throws Exception
{
var writer = new StreamWriter(fileName, append);
writer.Write(data);
writer.Flush();
writer.Dispose();
}
我认为您应该始终为每个实现IDisposable
接口的对象使用using(...)
,这样您就可以确保它在超出范围时会被处理。
public static bool WriteFile(ByteBuffer data, String fileName, bool append)
{
using (StreamWriter writer = new StreamWriter(fileName, append))
{
try
{
writer.Write(data);
writer.Flush();
return true;
}
catch (Exception ex)
{
// Do domething here, maybe log ex.Message
}
}
return false;
}
我建议删除代码
Exception ex
从捕获段
我同意其他人所说的,在更高级别上处理异常,让它们冒出来。
如果您真的"必须"在这里处理它们,并且只返回true或false,请注意,到目前为止,所有其他解决方案都无法捕捉到打开/创建文件时可能发生的异常。
还要注意的是,我仍然会经历这样的麻烦,即只捕捉那些实际被记录为可能发生的异常。
为此,您还需要将StreamWriter
构造函数放入try
块中:
public static bool WriteFile(ByteBuffer data, string fileName, bool append)
{
StreamWriter writer = null;
Exception exception = null;
try
{
writer = new StreamWriter(fileName, append);
writer.Write(data);
}
catch (UnauthorizedAccessException ex)
{
exception = ex;
}
catch (SecurityException ex)
{
exception = ex;
}
catch (IOException ex)
{
exception = ex;
}
finally
{
if (writer != null)
{
try {
writer.Close();
} catch (EncoderFallbackException) { /* arguably log this as well */ }
}
if (exception != null)
{
// Log exception
return false;
}
return true;
}
}
请注意,它们是实现相同行为的几种其他方式;包括使用using
块或注意缓存异常并将其记录在finally
中但直接记录在相应的catch
块中。YMMV。