我对异常没有太多经验,我正试图弄清楚如何在现实世界的场景中正确使用异常处理。在 C# 中。
在此示例中,我有一个顶级函数 LoadModel,它调用许多其他函数(调用其他函数,...):
class Core
{
public void LoadModel(string file_name)
{
try
{
// call other functions (that call other functions, …) that may throw exceptions
}
catch (Exception ex)
{
if (ex is ArgumentNullException ||
ex is ArgumentException ||
ex is EncoderFallbackException ||
ex is InvalidOperationException ||
ex is XmlException ||
ex is InvalidDataException ||
ex is IOException)
{
// show error message
}
else
{
// unsupported exception. system may be unstable. let it crash.
throw;
}
}
}
}
我遵守了这个规则:
- 所有函数都使用异常报告错误,即它们不返回错误代码。它与 .NET 框架中的范例相同。
- 如果您在某个较低级别的函数中并且发生了异常并且不适合在此向用户报告失败,请不要捕获异常并让它向上传播调用堆栈。
- 不要使用空 catch 在顶层捕获所有异常。它会隐藏您的应用程序的问题,并可能破坏它的稳定性。仅捕获您知道如何从中恢复的异常。
问题:这是您处理异常的方式吗?即,我检查我的受保护代码生成了哪些异常(还考虑所有嵌套函数),决定从哪个可以安全恢复并将它们放入高级捕获中。我可以从他们的文档中获取 .NET 函数的异常列表,对于我自己的函数,我应该在他们的文档中保留异常列表。而且这个异常列表趋于累积:一个函数可以抛出它自己的异常和它的嵌套函数的异常……。我似乎很容易出错。有人在某个嵌套函数中添加了新异常,而您的顶级 catch 将无法处理它。使用错误代码,您可以执行“if (error != SUCCESS)”之类的操作来捕获所有错误,但您不能使用异常来执行此操作(如果您不想使用空 catch)。