【问题标题】:How to correctly handle success and errors after using another method使用另一种方法后如何正确处理成功和错误
【发布时间】:2014-05-01 00:35:48
【问题描述】:

我无法想出一个解决方案来处理整个应用程序中一致的成功或失败(错误),到目前为止,我一直无法从 3 种可能的解决方案中做出决定。(我对 OOP 比较陌生)

例如,如果我想使用 CURL 登录远程 api,我可以创建一个具有类似于以下结构的方法的类。

class Api
{
    var $curl;
    var $user;
    var $pass;
    var $buffer;

    function __construct($user,$pass)
    {
        $this->curl = new curl();
        $this->user = $user;
        $this->pass = $pass;
    }

    functon login()
    {
        $url = 'http://example.com/login/';
        $postfields = array($user => $this->user, $pass => $this-pass);

        $this->buffer = $this->curl->post($url,$postfields);
    }

}

使用 login() 后,我们有一些可能的结果,成功登录,错误登录(来自 api 的信息,例如用户/密码不正确),页面加载失败(服务器不可用)或 CURL 错误。(可能还有更多问题,但已列出够了)

一种基本方法是创建另一种方法 loginSuccessful()

loginSuccessful()
{
    if(strstr($this->buffer,'Welcome user: "zzzz"'))
        return true;

    if(strstr($this->buffer,'Incorrect user or pass'))
        return false;

    if(strstr($this->buffer,'server unavailable'))
        return false;

    if(curl_error($this->curl->ch))
        return false;

    else
        return false;
}

我可以在我们发布数据后在 login() 方法中调用它。

    functon login()
    {
        $url = 'http://example.com/login/';
        $postfields = array($user => $this->user, $pass => $this-pass);

        $this->curl->post($url,$postfields);

        if(loginSuccessul())
            return true;
        else
            false;
    }

这种方式当然太基础了,并没有提供太多关于错误的信息,为了改进这一点,如果成功,我仍然可以返回 true,如果不成功,我可以返回错误消息(而不是 false)。

loginSuccessful()
{
    if(strstr($this->buffer,'Welcome user: "zzzz"'))
        return true;

    if(strstr($this->buffer,'Incorrect user or pass'))
        return 'Incorrect user or pass';

    if(strstr($this->buffer,'server unavailable'))
        return 'server down';

    if(curl_error($this->curl->ch))
        return curl_error($this->curl->ch);

    else
        return 'some other error';
}

我们和以前一样使用它,但是返回不同的类型感觉有些不对劲。(有时是布尔值,有时是字符串)

另一种可能的方法是保持第一种方法中的真/假样式,但构建另一个方法,如 loginError(),我们再次将其与 login() 一起放置

    functon login()
    {
        ...
        ....
        if(loginSuccessul())
            return true;
        else
            return loginError();
    }

这现在给了我们一些详细的错误信息,但即使是这种方法也感觉不对,因为总的来说我将大量的文本信息与逻辑混合在一起,也似乎我违反了一些 SOLID 原则。

可能问题出在班级结构和我的方法上,我所做的一切都是不正确的,因为我的工作结构/心态不好。

提前感谢您的任何想法。

【问题讨论】:

    标签: php oop exception single-responsibility-principle


    【解决方案1】:

    为了做到这一点:你想要一个登录函数,它确实返回一些东西,这样你就知道一切正常,再加上一些额外的东西来确定如果函数失败,什么不起作用?

    我知道有 2 种可能性来归档这个:

    1. return bool(无论是否有效,为真/假)并在您的类中提供一个额外的错误字符串,该字符串不会被返回,可以单独设置。有关详细信息,请参阅 MSDN 的 GetLastError。你可以在你的 PHP 脚本中实现类似的东西。

    2. 例外 (-> PHP: Exception - Manual )

      if(strstr($this->buffer,'server unavailable')) throw new Exception("some wild     exception occured, feed me with some data and catch me later");
      

    我个人建议您使用异常,因为它们通常比手动构建错误代码和错误字符串更好/更容易维护并且耗时更少。

    【讨论】:

    • 正确,我认为我提供的示例将是许多应用程序中出现的一般问题,因此我还认为它会有一个完善的处理方法。我现在要研究异常。谢谢
    • 在对异常进行研究之后,我认为最好不要在这里使用它们,我不认为所有这些事件都是真正的异常,也许 CURL 可能是,但不是无效的用户名等。hmmmm .
    • 您的程序/脚本需要登录才能做任何您想做的事情。如果此登录失败,您将无法使用此脚本执行任何操作。假设这一点,在这部分抛出的异常实现了它们的目的。这是不应该发生的事情,但它发生了,你必须处理这种情况。
    猜你喜欢
    • 2017-08-09
    • 1970-01-01
    • 2019-05-25
    • 2020-01-28
    • 2020-06-11
    • 2018-07-03
    • 2022-07-27
    • 2011-01-12
    相关资源
    最近更新 更多