Đối với những ngày tôi đang đấu tranh khó khăn (nhưng vô ích) với mặt nạ ngoại lệ.Trường hợp ngoại lệ mặt nạ trong Delphi
Tôi đã phát triển một ứng dụng tạo ra các phép tính điểm nổi nặng trên hàng trăm nghìn bản ghi. Rõ ràng là mã phải có khả năng xử lý các ngoại lệ, đặc biệt là các mã liên quan đến tính toán dấu phẩy động: Overflow, ZeroDivide, vv ..
Ứng dụng chạy đúng theo Windows 7 (32bit hoặc 64bit) với nhiều loại bộ vi xử lý khác nhau, nếu lỗi xảy ra các điều kiện được xử lý đúng cách, một ngoại lệ được nâng lên và hồ sơ được loại bỏ.
Thật không may, các sự cố bắt đầu khi tôi khởi chạy ứng dụng chỉ ở nơi dự định chạy: trên một máy chủ chuyên dụng với CPU Intel Xeon E5-2640 v2 và Windows Server 2003 R2. Ở đây các ngoại lệ không được nâng lên: các bản ghi có lỗi sẽ không bị loại bỏ và do đó kết quả bị ô nhiễm bởi các giá trị số này mà máy mô tả +INF
hoặc -INF
.
Vấn đề là trên máy chủ các thiết lập mặc định của mặt nạ lỗi là khác nhau từ những người mà chúng ta tìm thấy trong Windows 7. Đặc biệt, kêu gọi các thủ tục GetExceptionMask
trên máy chủ theo mặc định tôi thấy exZeroDivide
trong khi nếu gọi GetExceptionMask
trên Windows 7 ngoại lệ này không bị che khuất. Kết quả là những gì tôi đã nói: chạy ứng dụng trên máy chủ những ngoại lệ này không được nâng lên nhưng được xử lý bởi bộ xử lý trả về cực đoan và "gây ô nhiễm" các giá trị số.
Ok, đừng hoảng sợ, tôi nói, bạn chỉ cần gọi (ví dụ: trong phần khởi tạo) SetExceptionMask
không bao gồm exZeroDivide
, nhưng không hoạt động. Hoặc tốt hơn, mặc dù ngay sau khi gọi SetExceptionMask
ngoại lệ exZeroDivide
không còn bị che khuất, khi được thực thi mã có tính toán dấu phẩy động, tập hợptrả về GetExceptionMask
vẫn chứa exZeroDivide
và do đó nếu xảy ra lỗi ngoại lệ.
Bất cứ ai có thể cho tôi biết cách gọi đúng SetExceptionMask
là gì?
Đó là lý do khiến mặc định mặt nạ có thể khác với máy tính và cách khác? hệ điều hành hoặc loại bộ vi xử lý?
Cảm ơn.
Đây là mô tả hay nhưng bạn có thể đăng một số mã mẫu tạo ra ngoại lệ và mẫu để cho biết cách bạn đang cố xử lý mặt nạ không? Điều đó sẽ giúp chúng tôi dễ dàng hơn trong việc giúp bạn tìm ra giải pháp. :) –
Tôi đồng ý, khó mà nói mà không thấy bạn đang làm như thế nào. Tôi khuyên bạn nên bắt đầu một ứng dụng thử nghiệm hoàn toàn mới để tái tạo hành vi này và chia sẻ mã đó với chúng tôi. –
Có vẻ như một thứ gì đó đang được đưa vào quá trình của bạn trên Server 2003 - trình kiểm tra virus, móc toàn cục, tiện ích theo dõi hệ thống khác? - đặt từ cờ FP với giá trị không chính xác. –