1

我想获取我计算机的所有 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();
    }
4

5 回答 5

4

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

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

于 2013-02-12T22:22:42.703 回答
1

处理那些你可以做的事情,或者你想以特定方式处理的(认为连接失败会驱动一个消息框来提示你是否连接到网络)

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

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

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

于 2013-02-12T22:26:33.560 回答
1

如果您真的想丢弃异常,请使用空的catch.

try
{
   // Code
}
catch {}

(注意那是一对花括号,不是()'s)

于 2013-02-12T22:22:58.770 回答
1

根据经验,如果您无法处理异常,正如您有一个空的 catch 块所证明的那样,那么您应该让它们冒泡到下一个级别。

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

于 2013-02-12T22:24:27.693 回答
0
  • 不要忽略异常,至少写一个日志行。即使您认为由于已知原因这将是一种已知类型的异常。

  • 不要无缘无故地捕捉异常——让它冒泡

  • 务必在每个外部入口点(事件处理程序、线程等)上放置 try/catch。从按钮单击处理程序中冒出的异常将导致您的应用程序崩溃,如果强制运行,另一个线程甚至同一线程上的代码也是如此就可以了(如 Windows.Forms.Control.Invoke(delegate))

  • 拥有最少数量的不同处理程序,并且当您实际上以不同方式处理异常时

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

于 2013-02-12T22:30:39.793 回答