Как разработчик PHP, вы можете использовать исключения , потому что они позволяют вам заметить, когда что-то пошло не так или пользователь поступил необычным образом (например, деление на ноль). Без исключений, ваше приложение в конечном итоге будет отображать нежелательные ошибки, и его будет намного сложнее отлаживать. Также важно, чтобы вы немедленно остановили выполнение и предприняли другие действия.
Исключения действительно просты, и они облегчат ваш прогресс в развитии. Когда вы научитесь использовать исключения, это станет обычной частью вашей разработки.
Что такое исключение?
Я думаю, что лучшее определение для исключений дает Мартин Фаулер :
Исключения сигнализируют о том, что находится за пределами ожидаемых границ поведения рассматриваемого кода.
На самом деле, исключение — это событие, которое происходит во время выполнения программы и нарушает нормальный поток инструкций программы. Когда вы генерируете (создаете объект исключения и передаете его в систему времени выполнения) исключение, система catch
его, найдя соответствующий обработчик и вернув соответствующее сообщение.
1
2
3
4
5
6
|
try {
// the code goes here
} catch (Exception $e) {
// if an exception happened in the try block above
}
|
Когда нам нужно использовать исключения?
Используйте исключения, когда ваша система сталкивается с исключительными обстоятельствами, которые мешают системе вступить во владение. Мы используем исключения только тогда, когда система не может определить, что произошло. Мартин Фаулер считает, что «если сбой является ожидаемым поведением, вам не следует использовать исключения». Это означает, что вы должны использовать исключения, когда вы не можете определить ошибку. Исключения следует использовать только в исключительных случаях.
Примечание. Исключения не подходят для обработки логических операций.
Для такой системы, как проверка ввода, использование исключений является неправильным . Прежде всего, будет определен входной текст, и в таком приложении, как это, мы должны сообщать о совокупности ошибок, а не об одной ошибке. Я верю в исключение использования исключений в любых обстоятельствах, когда мы можем ожидать неудачи проверки.
Поймать исключение очень важно, потому что, если вы не поймаете исключение, система вернет ошибку. Операция захвата должна быть как можно ближе к точке отказа.
Какие исключения Laravel?
Laravel использует обработчик исключений , который является классом в App\Exceptions\Handler.php
. Этот класс содержит два основных метода (метод renderHttpException
, который используется для всех исключений HTTP, например 404 и 503, находится в родительском классе Handler). Первый — это report
, который используется для регистрации исключений или отправки их во внешнюю службу. Вот пример метода отчета:
1
2
3
4
5
6
7
8
|
public function report(Exception $e)
{
if ($e instanceof CustomException) {
//
}
return parent::report($e);
}
|
Второй render
. Метод render отвечает за преобразование данного исключения в ответ HTTP, который должен быть отправлен обратно в браузер. Вот пример метода рендеринга:
1
2
3
4
5
6
7
8
|
public function render($request, Exception $e)
{
if ($e instanceof CustomException) {
return response()->view(‘errors.custom’, [], 500);
}
return parent::render($request, $e);
}
|
Примечание. Вы можете использовать свойство $dontReport
обработчика исключений, чтобы игнорировать исключения по типу.
Вы можете переопределить методы исключения Laravel в своем собственном исключении следующим образом:
1
2
3
4
5
6
7
|
public function render($request, Exception $e)
{
if (config(‘app.debug’)) {
return parent::render($request, $e);
}
return $this->handle($request, $e);
}
|
Это будет отображаться, когда config debug имеет значение true.
Как создать собственное исключение Laravel?
Возможно, вам придется создать свой собственный класс исключений. Вам необходимо расширить базовый класс исключений Laravel — я создал абстрактный класс, который будет вести себя как базовый класс нашего пользовательского класса исключений. Создайте файл в App/Exceptions/monException.php
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
namespace App\Exceptions;
use Exception;
abstract class monException extends Exception
{
protected $id;
protected $details;
public function __construct($message)
{
parent::__construct($message);
}
protected function create(array $args)
{
$this->id = array_shift($args);
$error = $this->errors($this->id);
$this->details = vsprintf($error[‘context’], $args);
return $this->details;
}
private function errors($id)
{
$data= [
‘not_found’ => [
‘context’ => ‘The requested resource could not be found but may be available again in the future.
]
// …
];
return $data[$id];
}
}
|
И ваш исключительный класс:
1
2
3
4
5
6
7
8
9
|
namespace App\Exceptions;
class NotFoundmonException extends monException
{
public function __construct()
{
$message = $this->create(func_get_args());
parent::__construct($message);
}
}
|
Вы можете использовать вышеупомянутый класс в своем коде:
1
2
3
4
5
6
7
|
try {
throw new \App\Exceptions\NotFoundmonException(‘not_found’);
}
catch(\App\Exceptions\NotFoundmonException $e)
{
return $e->getMessage();
}
|
Помимо основного класса исключений Laravel, вы можете использовать пакет Assertion . Это может быть использовано как сторонний класс исключений; Вы можете использовать это, чтобы пропустить спагетти, if
блоки в вашем коде.
Чтобы установить пакет Assertion, вы должны выполнить следующую команду:
1
|
composer require beberlei/assert
|
Например, если вы хотите проверить адрес электронной почты пользователя, вы можете сделать это:
1
2
3
4
5
6
7
8
9
|
use Assert\Assertion;
use Assert\AssertionFailedException;
//…
try {
Assertion::email($value, «The value must be valid E-mail address»);
} catch(AssertionFailedException $e) {
$e->getValue();
$e->getConstraints();
}
|
Вывод
Независимо от языка, который вы выбираете, исключения очень важны для понимания, так как они помогают нам контролировать выполнение потока приложения.
Кроме того, они помогают нам регистрировать проблемы, когда они возникают, и помогают сделать наше приложение более надежным.
Как вы можете видеть из работы, описанной в этом руководстве, Laravel — это фреймворк, который предлагает отличную функциональность обработки веб-приложений веб-приложений.