如果尝试访问文件的代码位于前端,例如用于单击的事件处理程序,则可以检查错误情况,显示消息并返回。
如果我正确理解您的问题,您想知道是否应该这样做:
public void button_Click() {
if(!File.Exists(textBox.Text)) {
MessageBox.Show("Could not find the file");
return;
}
ProcessFile(textBox.Text); // would have thrown an exception if the file didn't exist
}
这很好,除非 ProcessFile 抛出任何其他类型的异常,它不会被处理。
你可以这样做:
public void button_Click() {
try {
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
在我看来,最好两者都做:
public void button_Click() {
try {
if(!File.Exists(textBox.Text)) {
MessageBox.Show("Could not find the file");
return;
}
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
通过这种方式,您可以向用户提供与他此时正在做的事情相关的最具体的消息。例如,如果他试图打开一个 Excel 文件,您可以说“找不到您要导入的 Excel 文件”。
这也适用于文件在您检查的点和您尝试处理文件的点之间被删除或重命名的情况。
或者,您可以通过以下方式完成类似的操作:
public void button_Click() {
try {
if(!File.Exists(textBox.Text)) {
throw new UserException("Could not find the file");
}
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
在这种情况下,您将创建自己的 Exception 类UserException
并直接传递该消息而不进行翻译。这将允许您重用用于显示消息的相同代码。
类中的异常
如果错误发生在某个类库中,那么您应该抛出异常。异常的目的是不能忽视错误。
例如,您不应该这样:
class MyFileHandler {
public void OpenFile(string fileName) {
if(!File.Exists(fileName)) return;
// do stuff
}
public void DoStuff() {
// do stuff
}
}
现在,如果开发人员打电话给myFileHandlerInstance.OpenFile("note.txt")
他,他会认为它有效。您可以返回一个布尔值,如下所示:
class MyFileHandler {
public bool OpenFile(string fileName) {
if(!File.Exists(fileName)) return false;
// do stuff
return true;
}
public void DoStuff() {
// do stuff
}
}
但是现在您依靠开发人员检查该值,这曾经是一种常见的方法,但是错误被忽略和忽略了,这就是为什么异常成为更好的实践的原因。
至于向用户显示什么,您真的不应该直接显示异常消息,这些消息是针对开发人员而不是用户的。我建议使用异常对象并返回最佳消息的方法,如下所示:
public string GetUserErrorMessage(Exception ex) {
if(ex is FileLoadException) {
var fileLoadException = (FileLoadException)ex;
return "Sorry but we failed to load the file: " + fileLoadException.FileName;
}
}
如果愿意,您可以检查异常属性以获取包括错误代码在内的详细信息。此外,我建议在某个地方捕获实际的异常详细信息以供您自己的调试目的,在某个用户看不到的地方。