我应该捕获多少豁免,以及正确的方法是什么?

时间:2013-02-12 22:19:12

标签: c# exception-handling

我想获取计算机的所有IP地址。如果出现问题(例外),我只想要返回空字符串。这是我使用的功能。 GetHostEntry会抛出几个异常,GetHostName也会抛出异常。我该如何处理所有这些例外?我应该一个接一个地抓住它们吗?这将使代码混乱。或者我应该只使用catch (Exception e)并在catch区块内不执行任何操作?处理它的最佳方法是什么?

  private string GetIpAddress()
    {
        var temp = new StringBuilder();
        try {
                var hostEntry = Dns.GetHostEntry(Dns.GetHostName());
                var ips = from address in hostEntry.AddressList
                      where (address.AddressFamily == AddressFamily.InterNetwork)
                      select address;

                foreach (IPAddress ip in ips) {
                     temp.Append(ip).Append(" ");
                }
        } catch (exception1) {

        } catch (exception2) {

        } .....

        return temp.ToString();
    }

5 个答案:

答案 0 :(得分:4)

当且仅当您可以对此做一些有用的事情时,您应该捕获特定的异常。否则,让Exception传播到可以对它做一些有用的事情。

您应该拥有一个全局异常处理程序,可以优雅地管理其他未捕获的异常。

答案 1 :(得分:1)

如果你真的想要抛弃异常,请使用空的catch

try
{
   // Code
}
catch {}

(请注意,这是一对花括号,而不是()

答案 2 :(得分:1)

根据经验,如果你不能处理异常,就像你有一个空的catch块一样,那么你应该让它们冒泡到一个新的水平。

您应该查看可以抛出的每个异常,并确定为什么可以抛出它以及您应该如何处理它。例如,如果DnsGetHostEntry()可以抛出异常,为什么会这样呢?您是否应该返回主机未找到错误?你应该返回一个理智的默认值,这在你的应用程序中是否有意义?

答案 3 :(得分:1)

处理您可以做某些事情的事情,或者您想要以特定方式处理的事情(认为无法连接驾驶消息框以提示您是否连接到网络)

对于其他“它出错”的异常,让它们传播到我们有意义的处理它的地方,或者重新抛出一个有意义的上下文异常并处理它适当的地方。

如果您尝试做的只是通过某个进程的网络向日志文件发送报告,让该异常终止您的进程是否有意义?不是真的,所以只需将顶级调用包装到SendNetworkReport即可。

如果它是整个过程的核心,那么让它传播到你的主要控制代码,并以某种上下文的方式中止该过程。

答案 4 :(得分:0)

  • 不要将异常静音,至少写一个日志行。即使你认为由于一个已知的原因它会成为一种已知的例外。

  • 不要出于明显的原因发现异常 - 让它冒泡

  • 在每个外部入口点放置try / catch - 事件处理程序,线程等。从按钮单击处理程序冒泡的异常会导致应用程序崩溃,代码也是如此在另一个线程上,甚至在强制在其上运行的同一个线程上(例如Windows.Forms.Control.Invoke(delegate))

  • 如果您实际上以不同方式处理异常,则拥有最少量的不同处理程序和

  • 向AppDomain.UnhandledException添加一个侦听器并记录这些