Đây là một Q có liên quan: Việc sử dụng mệnh đề cuối cùng để thực hiện công việc sau khi trả lại kiểu xấu / nguy hiểm?
Trong Q được tham chiếu, mã cuối cùng có liên quan đến cấu trúc được sử dụng và sự cần thiết của việc tìm nạp trước. Câu hỏi của tôi hơi khác một chút và tôi tin rằng nó phù hợp với đối tượng rộng lớn hơn. Ví dụ cụ thể của tôi là một ứng dụng winform C #, nhưng điều này cũng sẽ áp dụng cho việc sử dụng C ++ / Java.
Tôi nhận thấy khá nhiều khối thử bắt cuối cùng, nơi có rất nhiều mã không liên quan đến ngoại lệ và xử lý ngoại lệ / dọn dẹp được chôn trong khối. Và tôi sẽ thừa nhận sự thiên vị của mình đối với việc có các khối thử-bắt-cuối rất chặt chẽ với mã liên quan chặt chẽ đến ngoại lệ và xử lý. Dưới đây là một số ví dụ về những gì tôi đang thấy.
Các khối thử sẽ có rất nhiều cuộc gọi sơ bộ và các biến được đặt dẫn đến mã có thể ném. Thông tin đăng nhập sẽ được thiết lập và chạy trong khối thử.
Cuối cùng, các khối sẽ có các cuộc gọi định dạng biểu mẫu / mô-đun / điều khiển (mặc dù ứng dụng sắp kết thúc, như được thể hiện trong khối bắt), cũng như tạo các đối tượng mới như bảng điều khiển.
Roughly:
tên phương thức (...) { thử { // Rất nhiều mã cho phương thức ... // mã có thể ném ... // Nhiều mã hơn cho phương thức và trả về ... } bắt (cái gì đó) {// xử lý ngoại lệ} cuối cùng { // một số dọn dẹp do ngoại lệ, đóng cửa mọi thứ // thêm mã cho nội dung đã được tạo (bỏ qua mọi trường hợp ngoại lệ có thể đã ném) ... // có thể tạo thêm một số đối tượng } }
Mã này hoạt động, vì vậy có một số giá trị cho nó. Nó không được gói gọn và logic hơi phức tạp. Tôi (đau đớn) quen thuộc với các rủi ro trong việc chuyển mã xung quanh cũng như tái cấu trúc, vì vậy câu hỏi của tôi tập trung vào việc muốn biết kinh nghiệm của người khác với mã có cấu trúc tương tự.
Liệu phong cách xấu có biện minh cho việc thay đổi? Có ai bị bỏng nặng từ một tình huống tương tự? Bạn có muốn chia sẻ chi tiết về trải nghiệm tồi tệ đó không? Rời khỏi đó là vì tôi phản ứng quá mức và nó không tệ về phong cách? Có được lợi ích bảo trì của việc dọn dẹp mọi thứ?
finally
trong C #). C ++ tương đương là gì? Những gì tôi nghĩ là mã sau catch
, và điều đó áp dụng tương tự cho mã sau C # finally
.
Environment.FailFast()
; nó có thể không được thực thi nếu bạn có một ngoại lệ chưa được lưu. Và nó thậm chí còn phức tạp hơn nếu bạn có một khối lặp finally
mà bạn lặp lại bằng tay.
finally
. Tất cả các sử dụng tốt được bảo hiểm theo RAII / RRID / SBRM (bất kỳ từ viết tắt nào bạn thích).