2011-08-31 118 views
0

我想创建一个删除从不断接触用户的功能。这个函数为常量联系调用一个包装类,并且它可以工作,但是如果给它提供一个在他们的站点上不存在的电子邮件地址,它会返回一个可捕获的致命错误。PHP错误信息帮助和try/catch

我是新来的try/catch和我不太得到在哪里放置,这样我可以创造一个优美的错误信息,而不是我发现了捕致命错误。下面是我当前的代码:

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 = "[email protected]"; //this is email is NOT in Constant Contact 
ccdeleteuser($emailtotry); 

现在如果我运行此我得到以下错误:

Catchable fatal error: Argument 1 passed to ConstantContact::deleteContact() must be an instance of Contact, null given, called in [path to my page] on line 19 and defined in [path to constant contact php wrapper file] on line 214

任何帮助表示赞赏!

+0

你应该检查'$ SearchContact'是否是一个数组;那么你不必担心异常。 –

+0

DUP:http://stackoverflow.com/questions/2468487/how-can-i-catch-a-catchable-fatal-error-on-php-type-hinting – xdazz

回答

1

做到这一点,正确的方法是先测试空:

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 ...赶上,你可以使它看起来像这样:

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

+0

谢谢您的回答,第一个非常完美!这种情况下,你在做“试着抓住”这样的事情时会感到很茫然,你忘记了有一种更简单(更有效)的方式! –