更好地处理连接到internet的方法中发生的异常

本文关键字:方法 异常 internet 处理 连接 更好 | 更新日期: 2023-09-27 18:23:49

我有很多方法可以连接到互联网来获得一些东西。所以我需要处理可能发生的WebException。但我想减少使用这些方法的代码中的try-catch块,因为它看起来很难看,很难查看。我现在要做的是返回一个带有enumTuple,我可以用它来查看方法是否失败或成功等。然后我用switchcase块来处理它。例如:

Tuple<GetIpReturn, string> ip = await _user.GetIp();
GetIpLocksReturn returnValue = ip.Item1;
switch (returnValue) {
    case GetIpLocksReturn.InternetError:
        // WebException occured
        break;
    case GetIpLocksReturn.AuthError:
        //
        break;
    case GetIpLocksReturn.Success:
        // Use ip.Item2 (The ip string)
        break;
}

但这与那些中断声明看起来也很混乱
通常情况下,错误案例的代码行数很少。有更好的方法吗?(可能使用委托?)

更好地处理连接到internet的方法中发生的异常

IMHO,您应该让异常发生。将异常封装在包含失败代码的返回值中与普通的.NET习惯用法相反,需要调用方和被调用方都有更多的代码(包括额外的try/catch处理增加的运行时成本),并且不能实现使用异常无法实现的任何功能。

将异常转换为故障代码也会丢失潜在的有用信息,如堆栈跟踪和HRESULT值。

请注意,如果您想向异常添加信息,您的实现可以捕获发生的异常,然后抛出一个新的自定义异常,您已经为其提供了原始异常作为InnerException属性值。


有关相关讨论,请参阅:
C#为什么抛出错误
我的方法应该抛出自己的异常,还是在文件不存在的情况下让.NET抛出?

它们并不是完全相同的问题,但它们都包含了关于为什么在.NET代码中首选异常的讨论。

我的答案是关于处理的异常,这意味着它已经发生了足够多,我们知道该怎么办;这是例行公事。例如,在我的应用程序中,在这些定义良好的情况下,我们只是向用户显示一条消息。当然,这取决于应用程序。我同意Peter的观点,即未处理的异常应该进入捕获,而不是切换。

只需返回一个类,该类包含a)友好的错误消息或空白,b)数据和c)boolSuccess。您也可以将状态代码和/或异常数据放入其中进行调试。如果不是Success,通常只想显示或记录错误消息,如果Success=true,通常只需要使用数据。成功告诉你是否可以在api调用后继续。

综上所述,OO出手相救。尝试使返回类更强,这样您就可以根据您所知道的最终将如何处理这些属性来消除开关(例如,显示错误消息)。