Jef*_*rey 4 .net c# exception-handling exception
我在代码中并没有真正使用任何try/catches,但我试图打破这种习惯,现在开始使用异常.
我认为在我的应用程序中最重要的地方是读取文件,我现在正在尝试实现它,但我不确定这样做的"最佳实践".目前我正在做这样的事情:
private void Parse(XDocument xReader)
{
IEnumerable<XElement> person = xReader.Descendants("Person").Elements();
foreach (XElement e in person)
personDic[e.Name.ToString()] = e.Value;
if (personDic["Name"] == null || personDic["Job"] == null || personDic["HairColor"] == null)
throw new KeyNotFoundException("Person element not found.");
}
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否正确.我有这个来处理它:
try
{
personsReader.Read(filename, persons);
}
catch (KeyNotFoundException e)
{
MessageBox.Show(e.Message);
return;
}
// Do stuff after reading in the file..
Run Code Online (Sandbox Code Playgroud)
但是,在显示e.Message时,它只显示通用的KeyNotFoundException错误消息,而不是自定义错误消息.此外,我不确定一般情况下,我是否正确地处理这整个"异常处理的东西".我确实在catch中返回,因为如果文件未成功读取,我只是想假装用户从未尝试打开文件并让他再次尝试使用其他文件.
我这样做了吗?我再次使用异常相当新,我想确保在继续将其应用到我的程序的其余部分之前将其记录下来.
还有,为什么人们说不做catch (Exception e)
呢?看起来在这种情况下我想要这样做,因为无论在读取文件时发生什么错误,如果有错误,我想停止读取文件,显示错误消息,然后返回.这不总是这样吗?我可以理解不想处理异常e如果你想根据异常处理不同的东西但是在这种情况下我不想只是处理基本异常类以防出现任何问题?
当你能够处理这个条件并做一些有用的事情时,你应该捕获异常.否则你应该让它冒泡调用堆栈,也许你上面的人可以处理它.有些应用程序有未处理的异常处理程序来处理最外层,但一般来说,除非你知道有一些有用的方法来处理它,否则就去吧.
在您的情况下,您处理的是无法读取资源并通知用户.你正在处理它.关于一般异常,你可以做的一件事是捕获并重新抛出一个更好的异常.如果这样做,请确保将根本原因异常作为内部异常.您还可以根据需要跟踪或记录详细信息.
throw new MyGoodExceptionType ("Could not read file", e); // e is caught inner root cause.
Run Code Online (Sandbox Code Playgroud)
现在UI显示了一个很好的错误,也许内部根本原因是在日志等...
一些典型的错误:
在通用库方法中处理堆栈深处的异常: 请记住,可以在许多不同的代码路径中调用公共库函数.您可能没有上下文是否应该处理以及是否适合处理它.堆栈中较高的调用者可能具有上下文并知道它是否可以安全处理.通常,这意味着更高层的代码决定处理.在较低层,通常让它们流动.
吞咽异常: 某些代码捕获异常(特别是堆栈中较低的异常),然后根条件就会消失,这使得调试变得令人抓狂.一旦痛风,如果你能处理它,那就这样做.如果没有,就放手吧.
例外应该是例外: 不要使用excpetions进行流量控制.例如,如果您正在阅读资源,请不要尝试阅读然后捕获异常并制定决策点.相反,调用ifexists,检查bool并在代码中做出决定.当您将调试器设置为中断异常时,这尤其有用.你应该能够运行干净,如果调试器中断,它应该是一个真正的问题.调试时调试器不断中断是有问题的.我个人非常喜欢极少抛出异常,并且总是试图避免流量控制.
希望有所帮助.
归档时间: |
|
查看次数: |
1192 次 |
最近记录: |