Справка по сообщениям об ошибках PHP и Try / Catch - PullRequest
0 голосов
/ 31 августа 2011

Я пытаюсь создать функцию, которая удаляет пользователя из постоянного контакта.Эта функция вызывает класс-обертку для постоянного контакта, и это работает, но если вы отправите ей адрес электронной почты, который не существует на их сайте, он вернется с поддающейся проверке фатальной ошибкой.

Я новичок, чтобы попробовать / поймать, и я не совсем понимаю, где это разместить, чтобы я мог создать изящное сообщение об ошибке вместо 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);

Прямо сейчас, если я запускаю это, я получаю следующую ошибку:

Исправляемая фатальная ошибка: аргумент 1 передан в ConstantContact :: deleteContact ()должен быть экземпляром Contact, с указанным нулевым значением, который вызывается в [path to my page] в строке 19 и определяется в [path to file contact php wrapper file] в строке 214

Любая помощь приветствуется!

1 Ответ

1 голос
/ 31 августа 2011

Правильный способ сделать это - сначала проверить на ноль:

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
    }
}

Как общее примечание, всегда лучше действовать упреждающе, чтобы предотвратить исключения, а не просто перехватывать их по факту. Я даже пойду настолько далеко, что скажу, что вы должны считать правилом всегда делать все, что в ваших силах, чтобы предотвратить возможность исключения, и использовать только попытку ... поймать как последнее возможное средство.

...