2010-09-02 7 views
2
if ($disponivel === 0) 
    { 
     $razao = $check->cd->reason; 
     $mensagem = "the domain isn't available. Reason: ".$razao; 
    } 
    elseif($disponivel === 1) 
    { 
     $mensagem = "the domain doesn't exist - free to register."; 
    } 

    return $mensagem; 
} 
else 
{ 
    throw new EppCommandsExceptions('Domain isn't supported - '.$result->msg, $codigo); 
} 

Вы видите эти $ mensagem строки? Они также являются сообщениями об ошибках, и мой вопрос заключается в том, что вместо того, чтобы иметь $ mensagem отображение некоторых сообщений об ошибках, можем ли мы использовать несколько исключений броска?Исключения php - можем ли мы иметь несколько бросков?

Обновление: Я НЕ хочу бросать исключения все сразу. Каждое исключение в свое время.

Спасибо заранее, MEM

+0

У меня обновить свой вопрос, а также перевод сообщений об ошибках. – MEM

ответ

5

Вы имеете в виду что-то вроде

else { 
    throw new XException(...); 
    throw new YException(...); 
    throw new ZException(...); 
} 

... и все они брошены "на один раз"?

Нет, это невозможно и не будет слишком много смысла imho. Как должен выглядеть код клиента, который ловит эти исключения?

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

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

catch(SomeException $e) { 
    $messages = $e->getErrorMessages(); 
} 

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


EDIT/UPDATE:

@MEM спасибо за обновление кода с английскими сообщениями об ошибках. Вы внедряете что-то вроде службы регистрации доменов?

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

Когда бы я выбрал исключение в приложении вроде твоего? Я не очень разбираюсь в регистрации домена, но если вы получаете информацию о том, является ли домен бесплатным или нет с удаленного сервера/веб-службы, и этот веб-сервис не работает, я бы выбрал исключение. Он попадает в Контроллер (я изображаю веб-приложение MVC), которое, в свою очередь, отвечает клиенту сообщением «Сервер вниз, пожалуйста, попробуйте еще раз позже».

+0

«Кроме того, вы не должны использовать исключения в качестве замены обычных структур управления потоком, исключения должны обрабатывать, а также исключительные ошибки, например, неспособность подключиться к базе данных и т. Д.» Хм ... Это обычное исключение, предназначенное только для устранения исключений EPP. Итак, как правило, у нас будет класс проверки для работы с общими ошибками. Если что-то проходит уровень проверки (я могу его назвать так?), Как на стороне клиента, так и на стороне сервера, тогда исключения будут иметь место. Почему мы предпочитаем иметь несколько мест для обработки ошибок, а не только 1? thks – MEM

+0

Мой последний комментарий Вопрос. Не сильное предположение, которое ни к чему не приведет. :) Я пытаюсь лучше понять, где мы должны использовать исключения или другие вещи ... и почему это лучший вариант. – MEM

+0

@MEM, пожалуйста, см. Мое редактирование, я попытался рассказать вам свое мнение о том, когда я воспользуюсь исключением и когда его целесообразно прибегнуть к «нормальному» проверке/контролю потока. – Max

0

Конечно, только подкласс базового исключения для каждого сообщения.

1

вы можете бросить и поймать различные исключения.

Если все, что вы хотите сделать, это распечатать ошибку, вы также можете исключить аналогичные исключения. Но я буду считать, что вам нужен другой подход к каждому случаю

function myFunction() { 
    if($a) { 
    throw new AException('A Error'); 
    } else if($b) { 
    throw new BException('B Error'); 
    } else if($c) { 
    throw new CExceptıon('C Error'); 
    } 
} 

try { 
    myFunctıon(); 
} catch (AException $aException) { 
    echo $aException->getMessage(); 
} catch (BException $bException) { 
    echo "this is a terrible case, don't do that again pls"; 
    $mydbobject->rollback(); 
} catch (CException $cException) { 
    mailDevTeam("the server made a boo boo"); 
} 
+0

Вы видите «EppCommandsExceptions»? Там я расширяю класс Exception, поэтому все ошибки EppCommand, которые я хотел бы передать этому обработчику исключений (если можно так выразиться). На данный момент, да, это всего лишь вопрос отображения сообщений пользователю. – MEM

2

Вы не можете бросить несколько, но так как PHP 5.3 вы можете поставить previous конструктору Exception, чтобы создать связанный список исключений.

Например, вот 3-элемент цепи:

$a = new Exception('Exception a'); 
$b = new Exception('Exception b', 0, $a); 
throw new Exception('Exception c', 0, $b); 

Затем в обработчике исключений, вы можете пройти через цепь с getPrevious

do { 
    printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e)); 
} while($e = $e->getPrevious()); 
Смежные вопросы