我已经开始使用这段代码2小时(字面上)的最佳部分,但我似乎无法理解为什么会失败。下面的方法不会报告任何异常,但它似乎返回false:
public bool SaveFile(string filename, object source)
{
bool result = true;
StringBuilder exportText = new StringBuilder(source.ToString());
try {
File.WriteAllText(filename, exportText.ToString());
}
catch (Exception e)
{
OnPluginError(new ErrorEventArgs(e));
result = false;
}
return result;
}
问题是:文件在请求的路径上正确写入,完整且可读。不会抛出任何异常,因为未调用OnPluginError()处理程序调用方法 - 在这种情况下将记录任何消息,但没有记录任何消息。它不能是权限问题,因为调用后文件确实存在。 而且,方法结果仍然是假的。
问题仅出现在发布版本中。在Debug版本中,所有似乎都可以正常工作。因此,我不能使用调试器来逐步完成。
这是从Web应用程序调用的。任何想法都赞赏。
答案 0 :(得分:1)
作为临时故障排除步骤,添加另一个try catch来阻止任何异常,然后查看该函数是否仍然返回false。
public bool SaveFile(string filename, object source)
{
bool result = true;
StringBuilder exportText = new StringBuilder(source.ToString());
try {
try {
File.WriteAllText(filename, exportText.ToString());
} catch(Exception e) { }
}
catch (Exception e)
{
OnPluginError(new ErrorEventArgs(e));
result = false;
}
return result;
}
如果它返回true,那么你已经隔离了问题并确定抛出了一个异常,导致运行带有result = false的块。
如果它仍然返回false,那么你可以确定问题是在这个函数之外,因为控制流的规则将决定结果变量永远不会被改变。
一种可能性是您遇到的问题是您认为正在运行的代码并未真正运行。例如,构建过程中的某些问题没有获取最近的代码更改或重定向。检查网站项目DLL的版本,进行清理/重建,添加附加代码以写出跟踪消息,您应该尝试交叉检查以验证最近的代码是否正在运行。
另一种可能性是代码中检查返回值的问题。
答案 1 :(得分:0)
WriteAllText()
方法根本没有关系。
仅供参考:此代码深入到广泛的插件库中。并非所有代码都是由我设计和编写的,并且已经存在了近2年而没有遇到问题。
正如我所提到的,WriteAllText()
运行良好。它做了。问题是保存的文件的位置存储在一个Dictionary中,而Dictionary又是从当前运行的插件中请求的。该词典(包含插件设置)结果是每次调用该属性时都是从头开始创建的!所以我可以添加到我想要的内容....在下一次调用该属性时,新添加的项目会因为字典重新创建而神奇地“消失”。
因为它之前从未出现过,并且该代码在很多其他插件中运行没有问题,所以我没有检查该属性。我的坏。
向所有回应浪费时间的人道歉。请放心,它不会很快发生!获得的经验......