Exceptions

Exceptions

Exceptions (ngoại lệ) là phương pháp kiểm soát một đoạn code có thể gây ra lỗi thông qua câu lệnh try...catch. Định nghĩa các hàm public class Exception trong PHP như sau:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class Exception extends Throwable {
  protected $message = 'Unknown exception';   // Nội dung exception 
  protected $code = 0;                        // code người dùng tự định nghĩa

  public function __construct(
    $message = null,
    $code = 0,
    Exception $previous = null
  );

  final public  function getMessage();        // Nội dung exception 
  final public  function getCode();           // code người dùng tự định nghĩa
  final public  function getFile();           // tên filename
  final public  function getLine();           // số dòng
  final public  function getTrace();          // một mảng backtrace()
  final public  function getPrevious();       // Các ngoại lệ trước đó
  final public  function getTraceAsString();  // thông tin ngoại lệ như string

  // Overrideable
  public function __toString();               // hàm để hiển thị thông tin
}

Contructor của Exception bao gồm $message là nội dung lỗi, $code là mã lỗi do chúng ta tự định nghĩa.

Trong đoạn mã try catch có thể ném ra một ngoại lệ. Trong đoạn catch có thể bắt từng loại ngoại lệ khác nhau dựa vào tên class exception. Ngoài ra trong đoạn catch cũng có thể ném ra một ngoại lệ khác. Ví dụ sau sẽ định nghĩa hàm tính nghịch đảo của một số.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?php
function inverse($x) {
  if (!$x) {
    throw new Exception('Chia cho số 0.');
  }
  return 1/$x;
}

try {
  echo inverse(5) . "\n";
  echo inverse(0) . "\n";
} catch (Exception $e) {
  echo 'Gặp lỗi: ',  $e->getMessage(), "\n";
}
/* ->
0.2
Gặp lỗi: Chia cho số 0.
*/

finally

Từ phiên bản PHP 5.5 đã có thể thêm khối lệnh finally sau khối lệnh try catch. Đoạn finally sẽ luôn được thực thi sau khi đoạn try catch chạy xong. Trong trường hợp trong đoạn try catch có câu lệnh return thì đoạn finally vẫn được thực thi rồi mới chạy câu lệnh return.

Trong trường hợp có hai câu lệnh return ở catch và finally thì sẽ chọn câu lệnh ở finally.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
function test() {
  try {
    throw new Exception('foo');
  } catch (Exception $e) {
    return 'catch';
  } finally {
    return 'finally';
  }
}

echo test(); // -> finally