2013-02-01 43 views
5

Có thể bắt lỗi trong số WindowProc gọi lại không? try/catch không hoạt động. Có vẻ như __try__except và cũng ngoại lệ phần cứng (ví dụ: AV) cũng không hoạt động.Ngoại lệ trong WindowProc


Cập nhật:

tôi đã tìm ra rằng thực sự này có thể ném ngoại lệ trong WindowProc gọi lại và bắt nó với catch khối bên ngoài WindowProc. Đã kiểm tra và hoạt động trên Windows XP x86. Tôi tìm thấy câu hỏi releated 64bit exceptions in WndProc silently fail Vấn đề dường như chỉ tồn tại trên Windows 7 x64 (và theo câu hỏi đó trên các phiên bản Windows x64 khác nữa).

Vì vậy, câu hỏi là có thể bằng cách nào đó để ném ngoại lệ trong WindowProc và bắt nó với catch chặn bên ngoài WindowProc? Tôi đã cài đặt hotfix của microsoft, đặt DisableUserModeCallbackFilter thành 1 trong sổ đăng ký và tốt nhất tôi nhận được là FATAL_USER_CALLBACK_EXCEPTION, không phải ngoại lệ của tôi.

+0

chức năng winapi không sử dụng ngoại lệ. Chúng được viết bằng C. – chris

+0

Có thể xác định lỗi bên trong gọi lại WindowProc mà không có ngoại lệ không? – Demion

+0

Chắc chắn, hãy gọi các chức năng từ đó, kiểm tra lỗi và sử dụng 'GetLastError' và tương tự. Tuyên truyền các kết quả nếu gọi từ một hàm được gọi trong 'WindowProc'. – chris

Trả lời

4

MSDN documentation for WindowProc có thông tin chi tiết về trường hợp ngoại lệ được ném/tuyên truyền từ WindowProc. Dường như các ngoại lệ chỉ được truyền trong các phiên bản Windows 32 bit.

Tuy nhiên, câu hỏi ban đầu của bạn khác với câu hỏi trong bản cập nhật của bạn. Đầu tiên là khoảng bắt ngoại lệ trong WindowProc và điều đó sẽ luôn hoạt động tốt. Cách thứ hai là về ném ngoại lệ từ WindowProc.

Tôi không chắc chắn về tính hữu dụng/sự cần thiết của phiên bản thứ hai. Thủ tục cửa sổ thường được gọi là kết quả của:

  1. Gọi công vănMessage trong vòng lặp tin nhắn. Không cần phải ném ngoại lệ trong trường hợp này vì làm như vậy sẽ khiến ứng dụng thoát ra. Nếu bạn gặp phải lỗi khiến ứng dụng thoát ra, chỉ cần gọi tới PostQuitMessage (0)
  2. Gọi SendMessage. Trong trường hợp này bạn không thực sự muốn ném ngoại lệ vì thủ tục cửa sổ sẽ được thực hiện trong chuỗi giao diện người dùng và nếu chuỗi cuộc gọi khác với chuỗi giao diện người dùng, chuỗi gọi sẽ không nhận được ngoại lệ, hãy gọi
  3. Gọi thủ tục cửa sổ trực tiếp. Các trường hợp ngoại lệ sẽ hoạt động tốt trong trường hợp này.
+1

Tôi muốn ném ngoại lệ khi thủ tục cửa sổ được gọi là kết quả của việc gọi DispatchMessage. Tôi biết rằng điều này có thể PostQuitMessage (0); hoặc sử dụng các biến toàn cầu để chỉ ra lỗi nhưng tôi muốn sử dụng các ngoại lệ để cung cấp thêm thông tin về lỗi như mã lỗi, số dòng trong WindowProc vv Vì vậy, câu hỏi của tôi thậm chí còn có thể ném ngoại lệ từ WindowProc trên phiên bản x64? Có lẽ nó có thể làm cho nó với __try __except? – Demion

+0

Nếu liên kết MSDN là chính xác và tôi đang đọc đúng, điều đó là không thể. Tuy nhiên, tại sao không chỉ làm tất cả các báo cáo lỗi ngay bên trong WindowProc và sau đó gọi PostQuitMessage (0) ;? – user1610015

+0

Bởi vì nó là bất tiện để xử lý lỗi ở hai nơi khác nhau, một trong WindowProc và khác trong khối catch.Tôi nghĩ rằng một trong những lợi thế ngoại lệ là bạn có thể xử lý tất cả các lỗi ở một nơi. Nhưng điều này không thực sự không liên quan đến câu hỏi. Dù sao cảm ơn cho câu trả lời. – Demion