【问题标题】:PHP Error Message Help and Try/CatchPHP 错误消息帮助和 Try/Catch
【发布时间】:2011-11-07 15:28:59
【问题描述】:

我正在尝试创建一个从恒定联系人中删除用户的函数。这个函数调用了一个用于持续联系的包装类,它可以工作,但是如果你给它一个在他们的网站上不存在的电子邮件地址,它会返回一个可捕获的致命错误。

我是 try/catch 的新手,但我不知道该放在哪里,以便我可以创建一个优雅的错误消息,而不是我得到的 Catchable Fatal Error。以下是我当前的代码:

function ccdeleteuser($emailaddress)
{
//this code accesses the constant contact wrapper class to delete a user based on email
$ConstantContact = new ConstantContact("basic", "apikey", "usr", "pwd");
$SearchContact = $ConstantContact->searchContactsByEmail($emailaddress);
$DeleteContact = $ConstantContact->deleteContact($SearchContact[0]);  
}

$emailtotry = "test@test.com";  //this is email is NOT in Constant Contact
ccdeleteuser($emailtotry);

现在如果我运行它,我会收到以下错误:

可捕获的致命错误:传递给 ConstantContact::deleteContact() 的参数 1 必须是 Contact 的实例,给定 null,在第 19 行的 [path to my page] 中调用,并在 [path to constant contact php wrapper file] 中定义在第 214 行

感谢任何帮助!

【问题讨论】:

标签: php try-catch constantcontact


【解决方案1】:

正确的做法是先测试null:

function ccdeleteuser($emailaddress)
{

    $ConstantContact = new ConstantContact("basic", "apikey", "usr", "pwd");
    $SearchContact = $ConstantContact->searchContactsByEmail($emailaddress);
    // first makes sure that the 0 index of of SearchContact is accessible at all
    // then it ensures that only something "truthy" will trigger delete -- this
    // means that if $SearchContact[0] is null, the function won't try to delete
    if( $SearchContact && isset( $SearchContact[0] ) && $SearchContact[0])
        $DeleteContact = $ConstantContact->deleteContact($SearchContact[0]);  
    else
        echo "Can't do nothin'"; // do something useful?
}

使用 try...catch,你可以让它看起来像这样:

function ccdeleteuser($emailaddress)
{

    $ConstantContact = new ConstantContact("basic", "apikey", "usr", "pwd");
    $SearchContact = $ConstantContact->searchContactsByEmail($emailaddress);
    try
    {
        // keep this... it is still useful
        if( $SearchContact && isset( $SearchContact[0] ) && $SearchContact[0])
            $DeleteContact = $ConstantContact->deleteContact($SearchContact[0]);  
        else
            echo "Can't do nothin'";
    }
    catch( Exception $e )
    {
        // I'm making up a function "log" which will record that an error 
        // has taken place. It is a good idea to always log all exceptions
        // so that you don't accidentally obfuscate something important
        log( $e->getMessage() );
        // do something useful
    }
}

作为一般说明,最好主动采取行动来防止异常,而不是在事后简单地捕获它们。我什至会说,您应该将其视为一条规则,始终尽其所能防止出现异常的可能性,并且只使用 try...catch 作为最后可能的手段。

【讨论】:

  • 感谢您的回答,第一个效果很好!在这种情况下,您对“尝试并抓住”的想法过于狭隘,以至于忘记了有一种更简单(更有效)的方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多