Chúng tôi đang có một ứng dụng WPF trong đó các phần của nó có thể đưa ra ngoại lệ khi chạy. Tôi muốn bắt toàn cầu bất kỳ ngoại lệ nào chưa được xử lý và ghi lại chúng, nhưng nếu không thì tiếp tục thực hiện chương trình như thể không có gì xảy ra (giống như VB On Error Resume Next
).
Điều này có thể có trong C #? Và nếu vậy, chính xác thì tôi cần đặt mã xử lý ngoại lệ ở đâu?
Hiện nay tôi không thể nhìn thấy bất kỳ điểm duy nhất mà tôi có thể quấn một try
/ catch
xung quanh và trong đó sẽ bắt tất cả các trường hợp ngoại lệ có thể xảy ra. Và thậm chí sau đó tôi sẽ để lại bất cứ thứ gì đã bị xử tử vì bị bắt. Hay tôi đang suy nghĩ sai hướng khủng khiếp ở đây?
ETA: Bởi vì nhiều người dưới đây đã chỉ ra: Ứng dụng này không dành cho việc kiểm soát các nhà máy điện hạt nhân. Nếu nó gặp sự cố thì đó không phải là vấn đề lớn nhưng các trường hợp ngoại lệ ngẫu nhiên chủ yếu liên quan đến UI là một mối phiền toái trong bối cảnh sử dụng nó. Có (và có lẽ vẫn còn) một vài trong số đó và vì nó sử dụng kiến trúc plugin và có thể được mở rộng bởi những người khác (cũng là sinh viên trong trường hợp đó; vì vậy không có nhà phát triển có kinh nghiệm nào có thể viết mã hoàn toàn không có lỗi).
Đối với các trường hợp ngoại lệ bị bắt: Tôi đăng nhập chúng vào một tệp nhật ký, bao gồm cả dấu vết ngăn xếp hoàn chỉnh. Đó là toàn bộ điểm của bài tập đó. Chỉ để chống lại những người đã đưa sự tương tự của tôi đến Oern của VB theo đúng nghĩa đen.
Tôi biết rằng việc mù quáng bỏ qua các lớp lỗi nhất định là nguy hiểm và có thể làm hỏng ứng dụng của tôi. Như đã nói, chương trình này không phải là nhiệm vụ quan trọng đối với bất kỳ ai. Không ai trong tâm trí của họ sẽ đặt cược sự sống còn của nền văn minh nhân loại vào nó. Nó chỉ đơn giản là một công cụ nhỏ để thử nghiệm phương pháp thiết kế nhất định. kỹ thuật phần mềm.
Đối với việc sử dụng ngay lập tức của ứng dụng, không có nhiều điều có thể xảy ra với một ngoại lệ:
- Không có xử lý ngoại lệ - hộp thoại lỗi và thoát ứng dụng. Thử nghiệm phải được lặp lại, mặc dù có khả năng với một đối tượng khác. Không có lỗi đã được đăng nhập, đó là điều không may.
- Xử lý ngoại lệ chung - lỗi lành tính bị mắc kẹt, không có tác hại. Đây phải là trường hợp phổ biến được đánh giá từ tất cả các lỗi chúng ta đã thấy trong quá trình phát triển. Bỏ qua loại lỗi này sẽ không có hậu quả ngay lập tức; cấu trúc dữ liệu cốt lõi được kiểm tra đủ tốt để họ có thể dễ dàng sống sót qua việc này.
- Xử lý ngoại lệ chung - lỗi nghiêm trọng bị mắc kẹt, có thể gặp sự cố tại một điểm sau đó. Điều này có thể hiếm khi xảy ra. Chúng tôi chưa bao giờ nhìn thấy nó cho đến nay. Dù sao thì lỗi cũng được ghi lại và sự cố có thể xảy ra. Vì vậy, đây là khái niệm tương tự như trường hợp đầu tiên. Ngoại trừ việc chúng ta có một dấu vết ngăn xếp. Và trong phần lớn các trường hợp, người dùng thậm chí sẽ không nhận thấy.
Đối với dữ liệu thử nghiệm do chương trình tạo ra: Một lỗi nghiêm trọng nhất sẽ khiến không có dữ liệu nào được ghi lại. Những thay đổi tinh tế làm thay đổi kết quả của thí nghiệm từng chút một là rất khó xảy ra. Và ngay cả trong trường hợp đó, nếu kết quả có vẻ đáng ngờ thì lỗi đã được ghi lại; người ta vẫn có thể vứt bỏ điểm dữ liệu đó nếu nó hoàn toàn là ngoại lệ.
Tóm lại: Có, tôi cho rằng bản thân mình vẫn còn ít nhất một phần lành mạnh và tôi không xem xét một thói quen xử lý ngoại lệ toàn cầu khiến chương trình chạy hoàn toàn xấu xa. Như đã nói hai lần trước, một quyết định như vậy có thể có hiệu lực, tùy thuộc vào ứng dụng. Trong trường hợp này, nó đã được đánh giá là một quyết định hợp lệ và không hoàn toàn nhảm nhí. Đối với bất kỳ ứng dụng nào khác mà quyết định có thể trông khác nhau. Nhưng xin đừng buộc tội tôi hoặc những người khác đã làm việc trong dự án đó có khả năng làm nổ tung thế giới chỉ vì chúng tôi bỏ qua lỗi.
Lưu ý bên lề: Có chính xác một người dùng cho ứng dụng đó. Nó không phải là một cái gì đó giống như Windows hoặc Office được sử dụng bởi hàng triệu người trong đó chi phí có ngoại lệ bong bóng cho người dùng hoàn toàn sẽ khác nhau ở nơi đầu tiên.
On Error Resume Next
là không thể có trong C #. Sau khi Exception
(C # không có "lỗi"), bạn không thể tiếp tục với câu lệnh tiếp theo: thực thi sẽ tiếp tục trong một catch
khối - hoặc trong một trong các trình xử lý sự kiện được mô tả trong các câu trả lời bên dưới.