Trong bài đăng này, bạn sẽ học cách sử dụng xử lý ngoại lệ trong PHP. Kể từ PHP 5, chúng ta có thể sử dụng các khối try catch để xử lý lỗi—đây là cách tốt hơn để xử lý các ngoại lệ và kiểm soát luồng ứng dụng của bạn. Trong bài viết này, chúng ta sẽ tìm hiểu những kiến thức cơ bản về xử lý ngoại lệ cùng với một số ví dụ thực tế
Ngoại lệ là gì?
PHP 5 đã giới thiệu một mô hình lỗi mới cho phép bạn ném và bắt các ngoại lệ trong ứng dụng của mình—đây là cách xử lý lỗi tốt hơn so với cách chúng tôi có trong các phiên bản PHP cũ hơn. Tất cả các ngoại lệ là các thể hiện của lớp cơ sở
// code before the try-catch block
36, mà chúng ta có thể mở rộng để giới thiệu các ngoại lệ tùy chỉnh của riêng mìnhĐiều quan trọng cần lưu ý ở đây là xử lý ngoại lệ khác với xử lý lỗi. Khi xử lý lỗi, chúng ta có thể sử dụng hàm
// code before the try-catch block
37 để đặt chức năng xử lý lỗi tùy chỉnh của mình sao cho bất cứ khi nào một lỗi được kích hoạt, nó sẽ gọi hàm xử lý lỗi tùy chỉnh của chúng ta. Bằng cách đó, bạn có thể kiểm soát lỗi. Tuy nhiên, nói chung, một số loại lỗi nhất định không thể khôi phục và dừng thực thi chương trình.Mặt khác, các ngoại lệ được mã cố ý ném ra và dự kiến rằng chúng sẽ bị bắt tại một số điểm trong ứng dụng của bạn. Vì vậy, chúng tôi có thể nói rằng các ngoại lệ có thể phục hồi được trái ngược với một số lỗi không thể phục hồi. Nếu một ngoại lệ được ném ra bị bắt ở đâu đó trong ứng dụng của bạn, thì việc thực thi chương trình sẽ tiếp tục từ điểm mà ngoại lệ đó bị bắt. Và một ngoại lệ không được bắt gặp ở bất kỳ đâu trong ứng dụng của bạn sẽ dẫn đến lỗi, do đó tạm dừng thực thi chương trình
Luồng điều khiển xử lý ngoại lệ
Hãy tham khảo sơ đồ sau đây cho thấy luồng điều khiển xử lý ngoại lệ chung
Có thể ném và bắt các ngoại lệ bằng cách sử dụng các khối PHP
// code before the try-catch block
38 và // code before the try-catch block
39. Bạn chịu trách nhiệm đưa ra các ngoại lệ khi xảy ra điều gì đó không mong đợi. Hãy xem nhanh quy trình xử lý ngoại lệ cơ bản, như được hiển thị trong mã giả sau1__
// code before the try-catch block
__2
3
try {
// code before the try-catch block
0// code before the try-catch block
1// code before the try-catch block
2// code before the try-catch block
0// code before the try-catch block
1// code before the try-catch block
2// code before the try-catch block
3// code before the try-catch block
4// code before the try-catch block
6// code before the try-catch block
7// code before the try-catch block
8// code before the try-catch block
920
21
22
23
24
25
26
28
29
Hầu hết thời gian, khi bạn xử lý các trường hợp ngoại lệ, cuối cùng bạn sẽ sử dụng một mẫu, như được hiển thị trong đoạn mã trên. Bạn cũng có thể sử dụng khối
// code before the try-catch block
40 cùng với khối // code before the try-catch block
38 và // code before the try-catch block
39, nhưng chúng ta sẽ quay lại vấn đề đó sau trong bài viết nàyKhối
// code before the try-catch block
38 là khối được sử dụng khi bạn nghi ngờ rằng mã của mình có thể tạo ra ngoại lệ. Bạn phải luôn bọc mã như vậy bằng cách sử dụng // code before the try-catch block
38 và // code before the try-catch block
39. Ném một ngoại lệ
Một ngoại lệ có thể được đưa ra bởi một hàm mà bạn gọi, hoặc bạn có thể sử dụng từ khóa
// code before the try-catch block
46 để đưa ra một ngoại lệ theo cách thủ công. Ví dụ: bạn có thể xác thực một số đầu vào trước khi thực hiện bất kỳ thao tác nào và đưa ra một ngoại lệ nếu dữ liệu không hợp lệĐiều quan trọng cần lưu ý ở đây là nếu bạn đưa ra một ngoại lệ nhưng bạn chưa xác định khối
// code before the try-catch block
39 được cho là xử lý ngoại lệ đó, nó sẽ dẫn đến một lỗi nghiêm trọng. Vì vậy, bạn cần đảm bảo rằng bạn luôn xác định khối // code before the try-catch block
39 nếu bạn đang ném ngoại lệ vào ứng dụng của mìnhKhi một ngoại lệ được bắt gặp trong khối
// code before the try-catch block
39, đối tượng // code before the try-catch block
36 chứa thông báo lỗi được đưa ra bằng cách sử dụng từ khóa // code before the try-catch block
46. Biến // code before the try-catch block
52 trong ví dụ trên là một thể hiện của lớp // code before the try-catch block
36, vì vậy nó có quyền truy cập vào tất cả các phương thức của lớp đó. Trong khối này, bạn nên xác định logic xử lý ngoại lệ của riêng mình—chính xác bạn muốn làm gì với lỗi mà bạn gặp phảiTrong phần tiếp theo, chúng ta sẽ đi qua một ví dụ thực tế để hiểu cách xử lý ngoại lệ hoạt động
Một ví dụ thực tế
Trong phần này, chúng ta sẽ xây dựng một ví dụ thực tế để chứng minh việc xử lý ngoại lệ trong PHP
Giả sử rằng bạn đã xây dựng một ứng dụng tải cấu hình ứng dụng từ tệp config. tập tin php. Bây giờ, điều cần thiết là cấu hình. tệp php xuất hiện khi ứng dụng của bạn được khởi động. Do đó, ứng dụng của bạn không thể chạy nếu cấu hình. tập tin php không có mặt. Vì vậy, đây là trường hợp sử dụng hoàn hảo để đưa ra một ngoại lệ và cho người dùng biết rằng họ cần khắc phục sự cố
1__
1
2
try {
3
5
// code before the try-catch block
0_______7// code before the try-catch block
29
// code before the try-catch block
0// code before the try-catch block
233
// code before the try-catch block
435
// code before the try-catch block
637
// code before the try-catch block
839
20
try {1
22
try {3
24
// code before the try-catch block
926
try {7
28_______99__
// code before the try-catch block
00// code before the try-catch block
65_____1___1Như bạn có thể thấy trong ví dụ trên, chúng tôi đang kiểm tra sự tồn tại của cấu hình. php khi bắt đầu giai đoạn khởi động. Nếu cấu hình. php được tìm thấy, việc thực thi tiếp tục bình thường. Mặt khác, chúng tôi sẽ đưa ra một ngoại lệ nếu cấu hình. tập tin php không tồn tại. Ngoài ra, chúng tôi muốn dừng thực thi nếu có ngoại lệ
Vì vậy, đó là cách bạn có thể sử dụng ngoại lệ trong ứng dụng của mình. Bạn nên đưa ra ngoại lệ cho các trường hợp sử dụng đặc biệt—bạn không nên đưa ra ngoại lệ một cách không cần thiết cho các lỗi chung chung như thông tin xác thực người dùng không hợp lệ, quyền truy cập thư mục không phù hợp, v.v. , mà bạn mong đợi sẽ xảy ra thường xuyên. Chúng được xử lý tốt hơn bằng các thông báo lỗi chung trong quy trình thực thi ứng dụng thông thường
Vì vậy, đó là một ví dụ về xử lý ngoại lệ bằng cách sử dụng lớp
// code before the try-catch block
36 mặc định. Trong phần tiếp theo, chúng ta sẽ xem cách bạn có thể mở rộng lớp // code before the try-catch block
36 cốt lõi và tạo các ngoại lệ tùy chỉnh của riêng bạn trong ứng dụng của bạnCách tạo ngoại lệ tùy chỉnh
Trong phần này, chúng ta sẽ thảo luận cách bạn có thể tạo các ngoại lệ tùy chỉnh trong ứng dụng của mình. Trên thực tế, chúng tôi sẽ mở rộng ví dụ mà chúng tôi vừa thảo luận trong phần trước để chứng minh các ngoại lệ tùy chỉnh
Trong ví dụ trước, chúng tôi đã ném ngoại lệ cấu hình bằng cách sử dụng lớp
// code before the try-catch block
36 mặc định. Điều đó hoàn toàn ổn miễn là bạn chỉ muốn xử lý thông báo lỗi ngoại lệ. Tuy nhiên, đôi khi bạn muốn thực hiện thêm một chút dựa trên loại ngoại lệ đang được ném. Đó là nơi các ngoại lệ tùy chỉnh hữu íchHãy xem lại ví dụ trước, như được hiển thị trong đoạn mã sau
1
1
2
// code before the try-catch block
073
// code before the try-catch block
0try {
// code before the try-catch block
25
// code before the try-catch block
0// code before the try-catch block
29
// code before the try-catch block
4// code before the try-catch block
633
// code before the try-catch block
835
20
// code before the try-catch block
2522
39
24
try {1
26
try {3
28
3
// code before the try-catch block
005
// code before the try-catch block
027
8
try {9
// code before the try-catch block
00// code before the try-catch block
9// code before the try-catch block
02try {7
// code before the try-catch block
04try {9
// code before the try-catch block
0625
// code before the try-catch block
08// code before the try-catch block
03Đầu tiên, chúng ta đã định nghĩa lớp
// code before the try-catch block
57, mở rộng lớp // code before the try-catch block
36 mặc định. Bây giờ, nó trở thành lớp ngoại lệ tùy chỉnh của chúng ta và chúng ta có thể sử dụng nó khi muốn ném ngoại lệ // code before the try-catch block
57 vào ứng dụng của mìnhTiếp theo, chúng tôi đã sử dụng từ khóa
// code before the try-catch block
46 để ném ngoại lệ // code before the try-catch block
57 nếu cấu hình. tập tin php không tồn tại. Tuy nhiên, sự khác biệt quan trọng nằm ở khối // code before the try-catch block
39. Như bạn có thể thấy, chúng tôi đã xác định hai khối // code before the try-catch block
39 và mỗi khối được sử dụng để bắt một loại ngoại lệ khác nhauCái đầu tiên bắt ngoại lệ của loại
// code before the try-catch block
57. Vì vậy, nếu một ngoại lệ đang được ném thuộc loại // code before the try-catch block
57, thì khối này sẽ được thực thi. Nếu loại ngoại lệ không khớp với bất kỳ khối // code before the try-catch block
39 cụ thể nào, nó sẽ khớp với khối cuối cùng, khối này sẽ bắt tất cả các thông báo ngoại lệ chungkhối cuối cùng
Trong phần này, chúng tôi sẽ hướng dẫn cách bạn có thể sử dụng từ khóa
// code before the try-catch block
40 cùng với các khối // code before the try-catch block
38 và // code before the try-catch block
39. Đôi khi, bạn muốn thực thi một đoạn mã bất kể có ném ngoại lệ hay không. Đó là nơi bạn có thể sử dụng khối // code before the try-catch block
40, vì mã bạn đặt trong khối cuối cùng sẽ luôn được thực thi sau khi thực hiện các khối thử và bắt, bất kể có hay không có ngoại lệHãy cố gắng hiểu nó bằng ví dụ sau
1__
try {
2
// code before the try-catch block
13
// code before the try-catch block
0// code before the try-catch block
1// code before the try-catch block
2// code before the try-catch block
3// code before the try-catch block
0// code before the try-catch block
2// code before the try-catch block
7// code before the try-catch block
4// code before the try-catch block
9// code before the try-catch block
621
// code before the try-catch block
823
20
// code before the try-catch block
3122
// code before the try-catch block
3324
25
Mã trong ví dụ trên gần như giống nhau, với ngoại lệ duy nhất là chúng tôi đã thêm khối
// code before the try-catch block
40 sau khối // code before the try-catch block
39. Và, như chúng ta đã thảo luận, mã trong khối này sẽ luôn được thực thiCác trường hợp sử dụng điển hình cho khối cuối cùng thường liên quan đến dọn dẹp tài nguyên. Ví dụ: nếu bạn đã mở một kết nối cơ sở dữ liệu hoặc một tệp trên đĩa trong khối
// code before the try-catch block
38, bạn có thể thực hiện các tác vụ dọn dẹp như đóng kết nối trong khối // code before the try-catch block
40 vì nó được đảm bảo chạyXử lý ngoại lệ là một kỹ năng mã hóa quan trọng và bạn nên xem xét cách xử lý ngoại lệ trong khi phát triển ứng dụng của mình. Điều này sẽ giúp bạn phát hiện và khôi phục các lỗi không mong muốn trong ứng dụng của mình. Tôi hy vọng rằng bài đăng này sẽ truyền cảm hứng cho bạn để viết mã xử lý lỗi tốt hơn
Phần kết luận
Hôm nay, chúng ta đã thảo luận về chủ đề xử lý ngoại lệ bằng PHP try catch blocks. Trong nửa đầu của bài viết, chúng ta đã thảo luận về các khái niệm cơ bản về ngoại lệ trong PHP và xây dựng một ví dụ thực tế để minh họa cách chúng hoạt động. Cuối cùng, chúng tôi đã khám phá cách bạn có thể tạo các ngoại lệ tùy chỉnh bằng cách mở rộng lớp
// code before the try-catch block
36 cốt lõi