我想获取计算机的所有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();
}
答案 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添加一个侦听器并记录这些