Tôi đã tự đào mình vào một lỗ hổng với dự án mà tôi đang làm việc. Tôi đã có dự án khổng lồ này (100 trong số hàng nghìn dòng), và có những lỗi MySQL ở khắp mọi nơi. Tôi đang trong quá trình làm sạch chúng ngay bây giờ.Ném ngoại lệ mà không dừng thực hiện?
Tôi đã có lớp cơ sở dữ liệu này mà tất cả các truy vấn đi qua, vì vậy những gì tôi đã làm là bất cứ khi nào có một lỗi SQL, tôi ném một ngoại lệ ngay bây giờ. Vấn đề là tôi không thể ngừng thực hiện. Nó phải tiếp tục như nó luôn luôn có, và chỉ cần đăng nhập ngoại lệ để tôi có thể theo dõi chúng và sửa chúng từng cái một.
Tôi đã hy vọng set_exception_handler
sẽ làm những gì tôi muốn, nhưng các tài liệu đặc biệt nói rằng nó sẽ tạm dừng thực hiện sau khi gọi trình xử lý của tôi. Vì vậy, làm thế nào để tôi có được xung quanh này?
Ngoại lệ có thể tạm dừng chức năng hiện tại, nhưng sau đó tôi muốn nó thoát khỏi hàm, có thể trả về null hoặc false, và sau đó tiếp tục như bình thường, nhưng tôi cần nó để gọi trình xử lý ngoại lệ toàn cục của mình.
Để làm rõ:
Tôi muốn ném một ngoại lệ từ lớp cơ sở dữ liệu của tôi (bất cứ khi nào có một lỗi SQL). Sau đó tôi muốn đăng nhập lỗi này và/hoặc hiển thị thông báo trên màn hình cho đến khi tôi có thể khắc phục lỗi SQL hoặc quấn dòng vi phạm trong lần thử/nắm bắt. Tôi không muốn nó ngừng thực hiện. Nếu tôi chỉ cần gọi một số chức năng error_handler()
thay vì ném một ngoại lệ, thì tôi không thể bắt được nó. Nếu tôi nắm bắt nó ngay lập tức (cũng trong lớp DB), thì tôi không thể bắt nó xuống sâu hơn nữa (trừ khi tôi ném lại nó, nhưng sau đó chúng ta quay trở lại để ngừng thực hiện).
Nếu bạn đã cập nhật mã để dịch các lỗi MySQL thành ngoại lệ tại sao không chỉ đăng nhập lỗi thay vì ném một ngoại lệ? – pgraham
@pgraham: Darn nó ... đó là một câu hỏi hay. Lý do là vì tôi muốn có thể bắt được ngoại lệ nếu tôi không muốn nó rơi vào xử lý ngoại lệ toàn cầu. Ngoài ra, tôi muốn có một chức năng xử lý và ghi nhật ký tập trung. Cuối cùng, một khi tôi làm sạch các lỗi, tôi muốn sửa đổi xử lý ngoại lệ toàn cục một chút để nó thực sự * làm * chết và ném một lỗi nghiêm trọng. – mpen
@downvoter: Hãy cẩn thận giải thích tại sao đây là một câu hỏi tồi? – mpen