【发布时间】:2023-01-31 23:35:49
【问题描述】:
我和我的一位同事就我对 try catch 的使用发生了争执。 让我向您展示两个函数,它们(大致)做相同的事情但写法不同。我知道 try catch 没有最好的声誉,所以我想知道我是否应该改变我使用它的方式,或者这是否完全有效。 它主要是关于属性的验证,我完全知道我的 catch 块将“隐藏”很多问题,而不仅仅是参数为 null,但是如果我不能向我的服务器问好,我不希望应用程序崩溃我想要根据我的返回类型通知用户操作失败,无论出现什么问题,我总是只返回 false。
我使用 try catch 的实现:
bool SayHelloToServer(IPAddress ip, string message)
{
try
{
Client.Connect(ip);
Client.Send(message, message.Length);
return true;
}
catch (Exception)
{
return false;
}
}
建议的实施:
bool SayHelloToServer(IPAddress ip, string message)
{
if (Client == null)
return false;
if (ip == null)
return false;
if (message == null)
return false;
Client.Connect(ip);
Client.Send(message, message.Length);
return true;
}
【问题讨论】:
-
您可能应该同时执行这两项操作 - 验证输入然后执行 try/catch。异常是昂贵的,不应该用作流量控制。
-
“我知道 try catch 没有最好的声誉”- 不确定你在哪里听说过,但这没有多大意义。 Try/catch 是处理异常的方式。尽管显示的代码存在问题,但您不是在谈论异常,而是在谈论验证输入。这是两件截然不同的事情。您试图依赖异常来代替业务逻辑,这通常被认为是一种代码味道。使用异常来处理错误(例如在发出外部请求时出现网络错误),使用逻辑来执行业务逻辑。