2013-03-13 3 views
1

С короткого промежутка времени я работаю с Try Catch в PHP. Теперь, каждый раз, когда вызывается новая ошибка, вы получаете фатальную ошибку на экране, это не очень удобно для пользователя, поэтому мне было интересно, есть ли способ дать пользователю приятное сообщение, например, эхо, а не фатальную ошибку.Удобный для пользователя php try catch

Это код, у меня сейчас:

public static function forceNumber($int){ 
    if(is_numeric($int)){ 
     return $int; 
} else { 
     throw new TypeEnforcerException($int.' must be a number'); 
} 
} 

public function setStatus($status) { 
    try { 
     $this->status = TypeEnforcer::forceInt($status); 
    } catch (TypeEnforcerException $e) { 
     throw new Exception($e->getMessage()); 
    } catch (Exception $e) { 
     throw new Exception($e->getMessage()); 
    } 

} 
+1

Хорошо, если бы не было никакого способа сделать это, тогда не было бы места для блока try-catch. Это то, что он на самом деле делает –

+0

Не могли бы вы объяснить, как тогда ...? –

+0

Да, поделитесь некоторым кодом, который вы уже пробовали –

ответ

5

Это лучше всего решается с помощью контроллера внешнего интерфейса, который способен перехватывать все uncatched исключения:

<?php 
require('bootstrap.php'); 

try { 
    $controllerService->execute($request); 
} catch (Exception $e) { 
    $controllerService->handleControllerException($e); 
} 

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

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


Edit: Для функций низкого уровня, поскольку PHP является слабо типизированным, если функция ожидает и INT, cast to intDocs:

public static function forceNumber($int){ 
    $int = (int) $int; 
    return $int; 
} 

это будет на самом деле заставить целое. В случае невозможности сделать бросок (например, $int это полностью несовместимо) PHP сделает для вас исключение.

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

+0

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

+0

@NickAudenaerde: Это не исключение. Это сообщение, которое возвращает некоторый уровень проверки, чтобы вы могли отправлять сообщения на выходе. Обычно это выполняется на некотором уровне проверки запроса/формы. В функциях нижнего уровня вы бросаете «реальные» исключения (при необходимости). Имейте в виду, что один запрос может иметь * несколько сообщений об ошибках, но есть только одно исключение. – hakre

+0

@NickAudenaerde Я не уверен, что это причина, за которую предназначены исключения. – Voitcus