我只想在这里学习一些关于我的代码的新内容。
我有以下功能,如果我在写入文件时遇到问题,它是否是优化的返回方式?或者有一种更好的方式......
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;
}
答案 0 :(得分:4)
如果真的想要吃掉所有异常而只返回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);
}
}
答案 1 :(得分:2)
最好让它将异常抛出到应用程序层结构中的顶层。
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();
}
答案 2 :(得分:1)
我认为您应该始终对实现using(...)
接口的每个对象使用IDisposable
,因此您可以确保它在超出范围时将被处置。
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;
}
答案 3 :(得分:0)
我建议删除代码
Exception ex
来自catch部分
答案 4 :(得分:0)
我同意其他人所说的关于处理更高级别的异常并让它们冒泡的问题。
如果你真的“必须”在这里处理它们并且只返回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。