0

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

我是 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] 中调用,并在第 214 行的 [path to constant contact php wrapper file] 中定义

任何帮助表示赞赏!

4

1 回答 1

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 作为最后可能的手段。

于 2011-08-31T13:56:59.663 回答