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
|