Trước khi họ xuất hiện, hầu hết mọi người chỉ sử dụng throw new Exception[...]
cũ đơn giản hoặc tạo lớp Ngoại lệ của riêng họ để mở rộng lớp Ngoại lệ cơ sở
Nhưng bây giờ chúng tôi có tùy chọn sử dụng [hoặc mở rộng] các loại ngoại lệ cụ thể
Và bạn phải luôn sử dụng các ngoại lệ SPL [hoặc mở rộng chúng bằng một lớp con] và không bao giờ sử dụng /Exception
đơn giản nữa
Các lớp ngoại lệ SPL là gì?
Có khoảng một chục lớp ngoại lệ SPL, tất cả cuối cùng đều mở rộng lớp cơ sở \Exception
Bản thân chúng không thực sự làm bất cứ điều gì đặc biệt, nhưng có thể được sử dụng để báo cáo và xử lý một số loại lỗi nhất định
Chúng được sử dụng theo cùng một cách - chỉ cần sử dụng throw new OverflowException
Tại sao bạn nên sử dụng ngoại lệ SPL?
Họ đưa ra báo cáo lỗi chi tiết hơn. Đó là một thực tiễn tồi khi có 100 dòng mã ném chỉ Exception
. Lý tưởng nhất là bạn nên có các Ngoại lệ tùy chỉnh của riêng mình [sẽ mở rộng các ngoại lệ SPL], nhưng sẽ không thực tế khi làm điều này mỗi khi bạn có thể đưa ra một ngoại lệ
13 ngoại lệ SPL bao gồm nhiều tình huống phổ biến mà bạn sẽ gặp phải, chẳng hạn như đối số không hợp lệ [InvalidArgumentException] hoặc tràn [OverflowException]
Cách chọn ngoại lệ thích hợp
Đôi khi, có thể thực sự rõ ràng nên ném ngoại lệ nào [hoặc mở rộng với một lớp con], tuy nhiên, có một số trường hợp không rõ ràng hoặc nơi nó có thể phù hợp với hai hoặc nhiều lớp ngoại lệ
Khi không rõ nên chọn cái nào, bạn luôn có thể sử dụng lớp ngoại lệ gốc. Có hai lớp 'chính'
- LogicException bao gồm các lớp con sau
- BadFunctionCallException
- BadMethodCallException
- Ngoại lệ tên miền
- Ngoại lệ đối số không hợp lệ
- Độ dàiNgoại lệ
- OutOfRangeNgoại lệ
- BadFunctionCallException
- RuntimeException bao gồm các lớp con sau
- OutOfBoundsNgoại lệ
- Tràn ngoại lệ
- Phạm viException
- UnderflowException
- UnexpectedValueException
Vì vậy, bạn luôn có thể chỉ cần chọn ngoại lệ gốc có liên quan [nhưng đừng chọn lớp \Exception cơ sở nữa. ]
Phần lớn có xu hướng là một biến thể RuntimeException
13 ngoại lệ SPL - và khi nào thì sử dụng chúng
Ngoại lệ logic
Đây là lớp cha của khoảng một nửa số ngoại lệ SPL [RuntimeException là lớp cha của các lớp khác]
Nó được sử dụng khá phổ biến [mặc dù trong nhiều trường hợp bạn nên sử dụng một trong các lớp con của nó]. Sử dụng nó khi có lỗi trong logic chương trình
BadFunctionCallException
Ngoại lệ này không có xu hướng được sử dụng nhiều theo kinh nghiệm của tôi. Bạn nên ném nó nếu một cuộc gọi lại đề cập đến một chức năng không xác định hoặc nếu một số đối số bị thiếu
BadMethodCallException
Đây là một lớp con của BadFunctionCallException
Điều này tương tự với BadFunctionCallException, nhưng đối với các phương thức. Nó nên được sử dụng khi một phương thức của lớp không tồn tại, hoặc nó có các tham số sai [i. e. thiếu thông số]
Bạn sẽ thường thấy BadFunctionCallException bị ném vào phương thức __call[$method, $params]
của một lớp nếu tự. phương thức $[] không tồn tại
Ngoại lệ tên miền
Nên sử dụng ngoại lệ này nếu một giá trị không tuân theo miền dữ liệu hợp lệ đã xác định
Nó thường được sử dụng để 'kiểm tra vệ sinh'. Ví dụ: nếu bạn đang cố gắng mô phỏng ném một con xúc xắc 6 mặt, thì nếu giá trị > 6, bạn có thể ném một DomainException [vì các giá trị phải luôn từ 1 đến 6]. Nó được sử dụng khá nhiều trong các lớp cơ sở dữ liệu của Laravel nếu bạn cố gắng thực hiện một số hành động mà trình điều khiển cơ sở dữ liệu không hỗ trợ [ví dụ: thực hiện doAdvisoryLock[] sẽ đưa ra một DomainException nếu kết nối của bạn đến cơ sở dữ liệu SQLite, vì SQLite không
Ngoại lệ đối số không hợp lệ
Đây là một ngoại lệ thường được sử dụng khác. Bạn thấy nó khi một đối số [chẳng hạn như phương thức hoặc tham số hàm] không hợp lệ
Ví dụ, nếu bạn mong đợi $input
là một mảng, bạn có thể ném UnlimitedArgumentException nếu is_array[$input] != true
Độ dàiNgoại lệ
Ngoại lệ này được thiết kế để ném nếu độ dài không hợp lệ. Ví dụ: nếu độ dài chuỗi quá lớn hoặc quá nhỏ
Ví dụ: nếu bạn đang xử lý mã vạch ISBN-10 [luôn có độ dài 9 ký tự], nếu strlen[$input] != 9
thì bạn nên ném một ngoại lệ LengthException
OutOfBoundsNgoại lệ
OutOfBoundsException nên được ném ra nếu một giá trị không phải là khóa hợp lệ
Điều này thường được sử dụng khi cố gắng truy cập các mục trong một mảng không tồn tại hoặc độ lệch quá cao
Nó chỉ được sử dụng cho giá trị khóa không phải là chỉ mục [e. g. $array['some-key-that-does-not-exist']
. ]
Nếu bạn đang xử lý một chỉ mục số nguyên nằm ngoài giới hạn thì bạn nên sử dụng ngoại lệ tiếp theo. OutOfRangeNgoại lệ
ngoại lệ thời gian chạy
Đây là lớp cha của khoảng một nửa số ngoại lệ SPL và nó sẽ bị loại bỏ nếu xảy ra lỗi chỉ có thể tìm thấy trong thời gian chạy
OutOfRangeNgoại lệ
Điều này tương tự như OutOfBoundsException nhưng nên được sử dụng cho các chỉ mục mảng [số nguyên] không hợp lệ
Tràn ngoại lệ
Nếu bạn có một lớp chứa, và bạn cố gắng thêm một phần tử vào nó nhưng nó đã đầy thì bạn nên ném một ngoại lệ OverflowException. Chúng cũng có thể được sử dụng trong các tình huống mà bạn có số lần thử lại tối đa và sau ngày /Exception
0, bạn nên ném OverflowException
UnderflowException
Điều này ngược lại với OverflowException và được sử dụng khi xóa các phần tử trên vùng chứa trống
Nếu bạn có một lớp vùng chứa không có mục nào trong đó và mã của bạn cố xóa một mục thì bạn nên ném Ngoại lệ Underflow
Phạm viException
Điều này được sử dụng khi một giá trị không nằm trong một phạm vi giá trị cụ thể
Nó tương tự như DomainException nhưng lớp này mở rộng RuntimeException
UnexpectedValueException
Bạn nên đưa ra một UnexpectedValueException nếu một giá trị không khớp với một tập hợp các giá trị
Điều này thường xảy ra khi một hàm gọi một hàm khác và mong đợi giá trị trả về thuộc một loại hoặc giá trị nhất định không bao gồm các lỗi liên quan đến số học hoặc bộ đệm