【问题标题】:Useage of Try Catch vs. Property ValidationTry Catch 与属性验证的使用
【发布时间】: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 是处理异常的方式。尽管显示的代码存在问题,但您不是在谈论异常,而是在谈论验证输入。这是两件截然不同的事情。您试图依赖异常来代替业务逻辑,这通常被认为是一种代码味道。使用异常来处理错误(例如在发出外部请求时出现网络错误),使用逻辑来执行业务逻辑。

标签: c# try-catch


【解决方案1】:

在直接使用 try-catch 之前尝试处理诸如捕获 null 之类的错误的一般方法是正确的,但在您的情况下,您还需要一个 try-catch,因为 Connect 和 Send 也可能导致潜在的问题。

在您的情况下,正确的方法是 2 的组合。

bool SayHelloToServer(IPAddress ip, string message)
{
    try
    {
        if (ip != null) Client?.Connect(ip);
        if (message != null) Client?.Send(message, message.Length);
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

【讨论】:

  • 如果 ipmessage 为空,则返回 true
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 2019-02-08
  • 2020-03-13
相关资源
最近更新 更多