2009-08-05 26 views
6

Tôi đã đặt Application.OnException thành một trình xử lý ngoại lệ tùy chỉnh để tôi có thể đăng nhập sự cố và đưa ra một tùy chọn để thoát. Tuy nhiên, bây giờ tôi thấy rằng điều này chạy ngay cả trên các trường hợp ngoại lệ mà tôi đã xử lý, ví dụ, các trường hợp ngoại lệ xuất hiện khi xác thực số đầu vào. Có cách nào để xử lý ngoại lệ tùy chỉnh chỉ chạy trên các ngoại lệ chưa được xử lý?Làm cách nào để cho Delphi biết tôi đã xử lý ngoại lệ?

Chỉnh sửa: nó chỉ ra rằng tôi nhận được hành vi mong đợi khi tôi chạy bên ngoài trình gỡ lỗi. Có lẽ nó chỉ là một điều debugger. Tôi không tìm thấy sự tương tác của trình gỡ lỗi Delphi với các ngoại lệ để trực quan, để nói rằng ít nhất.

Trả lời

14

Nếu hành vi thay đổi bên trong và bên ngoài trình gỡ lỗi, thì không thực sự là chương trình của bạn đang cho bạn biết về ngoại lệ. Tôi đã viết về hiện tượng này trên trang web của tôi:

Why do I continue getting error messages even after I have written an exception handler?

Một đoạn trích:

Trong thiết lập mặc định của nó, là Delphi IDE thông báo cho bạn bất cứ khi nào một ngoại lệ xảy ra trong bạn chương trình ... . Điều quan trọng cần lưu ý là tại thời điểm đó, không có mã nào mã xử lý ngoại lệ của chương trình của bạn vẫn chạy. Đó là tất cả chính Delphi; trạng thái đặc biệt của nó như một trình gỡ rối cho phép nó nhận thông báo đầu tiên về bất kỳ ngoại lệ nào trong chương trình của bạn, ngay cả trước khi chương trình của bạn biết về nó.

Sau khi bạn bỏ qua hộp thư của Delphi, việc thực thi sẽ bị tạm dừng ở dòng mã nguồn tốt nhất của bạn Delphi có thể tìm thấy đại diện cho nguồn của ngoại lệ. Nhấn nút "Chạy" để chương trình của bạn tiếp tục. Kiểm soát sẽ chuyển đến bước tiếp theo cuối cùng hoặc ngoại trừ khối. Trước khi bạn tiếp tục chương trình của mình, bạn có thể sử dụng các công cụ gỡ lỗi khác nhau theo ý của mình. Bạn có thể kiểm tra các giá trị của bất kỳ biến nào trong phạm vi và thậm chí bạn có thể sửa đổi các giá trị của chúng.

Vì vậy, làm thế nào để bạn thông báo cho Delphi rằng bạn đã xử lý ngoại lệ?Bạn không - vì chương trình của bạn chưa xử lý nó. Và tại sao trình gỡ lỗi không thể phát hiện xem chương trình của bạn có đang là để xử lý ngoại lệ không? Bởi vì để làm điều đó, nó cần phải thực hiện chương trình của bạn hơn nữa. Phát hiện việc thiếu một trình xử lý ngoại lệ giống như giải quyết vấn đề dừng. Cách duy nhất để xác định liệu một ngoại lệ sẽ được xử lý là để cho chương trình chạy và sau đó xem liệu ngoại lệ có được xử lý hay không. Nhưng vào thời điểm đó, đã quá muộn để thực hiện bất kỳ việc gỡ lỗi nào, vì vậy trình gỡ lỗi không có lựa chọn nào khác ngoài việc tạm dừng chương trình của bạn khi nó phát hiện một ngoại lệ và sau đó cho bạn biết phải làm gì từ đó.

Bài viết của tôi đi vào để mô tả một số cách bạn có thể tránh việc trình gỡ lỗi bắt ngoại lệ nhất định, tóm tắt ở đây:

  • Sử dụng breakpoint tiên tiến để tạm thời vô hiệu hóa vi phạm về trường hợp ngoại lệ cho các khu vực nhất định của mã này.
  • Định cấu hình trình gỡ lỗi để bỏ qua một số loại ngoại lệ nhất định (và con cháu của chúng).
  • Yêu cầu trình gỡ lỗi không thông báo cho bạn về bất kỳ bất kỳ ngoại lệ nào.
  • Tắt hoàn toàn việc gỡ lỗi tích hợp.

Có một tùy chọn mà tôi đã không bao gồm trong bài viết của tôi:

  • Thay đổi chương trình của bạn như vậy mà các ngoại lệ không được lớn lên ở nơi đầu tiên.

Bạn nói rằng bạn đang xác thực tính năng nhập số. Điều đó nghe với tôi như bạn đang làm một cái gì đó như gọi StrToInt và sau đó bắt ngoại lệ EConvertError khi đầu vào không phải là một số nguyên hợp lệ. Đó là cách xác thực đầu vào đắt tiền. Thay vào đó, hãy sử dụng TryStrToInt, sẽ cho bạn biết liệu chuyển đổi đã thành công hay StrToIntDef, sẽ tự động trả lại giá trị mặc định thay vì tăng ngoại lệ. Một tùy chọn khác là đồng bằng cũ Val, mà cố gắng để chuyển đổi một chuỗi, và nếu nó không thành công, nó sẽ cho bạn biết vị trí nào trong chuỗi gây ra lỗi. Val đặc biệt hữu ích nếu bạn muốn tiêu thụ càng nhiều ký tự càng tốt cho chuyển đổi và sau đó tiếp tục phân tích cú pháp ở ký tự không phải là số tiếp theo.

+0

Wow, cảm ơn tất cả các đề xuất. Ngoại lệ không được xử lý khi chạy qua trình gỡ lỗi, tôi xem nó qua bước xử lý ngoại lệ, nhưng sau đó nó xuất hiện cho trình xử lý chung. Tôi sẽ xem xét các tùy chọn khác để chuyển đổi chuỗi, đó thực sự là điều chính. – Erika

+0

+1 Câu trả lời hay ở đó, Rob. – robsoft

+0

Việc cần làm nếu tôi muốn trình gỡ lỗi không phản ứng với loại ngoại lệ cụ thể trong thói quen cụ thể? Tôi không muốn đè nén tất cả. – Paul

1

Một giải pháp thay thế có thể là không sử dụng Application.OnException. Nhưng chỉ cần bắt tất cả ngoại lệ trong chức năng "chính" của bạn. Bằng cách đó bạn có thể nắm bắt tất cả các ngoại lệ mà bạn chưa lưu trữ trước đó, hãy ghi lại ngoại lệ và sau đó gặp sự cố.

+2

Đó chỉ là phương thức của Application.OnException. – jpfollenius

1

Application.OnException chỉ nên kích hoạt các ngoại lệ chưa được xử lý. Việc tăng lại một ngoại lệ trong khối try-except sẽ khiến ngoại lệ được xử lý bởi Application.OnException. Để xác nhận đầu vào làm tăng ngoại lệ, bạn có thể hiển thị một thông báo cho người dùng và sau đó chỉ nâng cao ngoại lệ nếu bạn muốn nó được ghi vào nhật ký lỗi.

+0

Điều kỳ lạ là nó xuất hiện để được nâng cao ngoại lệ mà không cần sự giúp đỡ của tôi. Nhưng khi tôi chỉnh sửa câu hỏi để nói, điều này chỉ xảy ra trong trình gỡ rối. Sự kì lạ. Cảm ơn mặc dù. – Erika

4

Trích dẫn từ tài liệu (Delphi 7) trên TApplication.OnException

"Use OnException to change the default behavior that occurs when an exception is not 
handled by application code." 

Vì vậy: Chỉ unhandled ngoại lệ sẽ có sẵn trong các xử lý sự kiện OnException. Những gì bạn đang trải qua có lẽ là IDE Delphi vi phạm về ngoại lệ. Đây là (ít nhất là trong Delphi 7) cấu hình.

Trong Delphi 7, bạn có thể định cấu hình bằng cách nhấp vào menu Tools-> Debugger Options. Sau đó chọn "Ngoại lệ ngoại ngữ", bỏ chọn hộp kiểm "Dừng trên Delphi ngoại lệ". Tuy nhiên nó có thể khác nhau trong các phiên bản delphi khác.

Các vấn đề liên quan