EDIT: Tôi đồng tình với những người khác đang nói rằng, kể từ C # 6.0, các bộ lọc ngoại lệ giờ đây là một cách hoàn toàn tốt để sử dụng:catch (Exception ex) when (ex is ... || ex is ... )
Ngoại trừ việc tôi vẫn ghét cách bố trí một dòng dài và cá nhân sẽ đặt mã ra như sau. Tôi nghĩ rằng đây là chức năng như nó là thẩm mỹ, vì tôi tin rằng nó cải thiện sự hiểu biết. Một số có thể không đồng ý:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
NGUYÊN:
Tôi biết tôi đến bữa tiệc muộn một chút, nhưng khói thánh ...
Cắt thẳng vào cuộc rượt đuổi, loại này trùng lặp một câu trả lời trước đó, nhưng nếu bạn thực sự muốn thực hiện một hành động chung cho một số loại ngoại lệ và giữ toàn bộ sự gọn gàng và gọn gàng trong phạm vi của một phương thức, tại sao không sử dụng lambda / đóng / chức năng nội tuyến để làm một cái gì đó như sau? Ý tôi là, rất có thể bạn sẽ nhận ra rằng bạn chỉ muốn biến việc đóng cửa đó thành một phương pháp riêng biệt mà bạn có thể sử dụng ở mọi nơi. Nhưng sau đó sẽ rất dễ dàng để làm điều đó mà không thực sự thay đổi phần còn lại của mã theo cấu trúc. Đúng?
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
Tôi không thể không tự hỏi ( cảnh báo: một chút mỉa mai / châm biếm phía trước) tại sao trên trái đất này phải nỗ lực hết sức để thay thế những điều sau đây:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
... với một số biến thể điên rồ của mùi mã tiếp theo này, ý tôi là, chỉ để giả vờ rằng bạn đang lưu một vài tổ hợp phím.
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
Bởi vì nó chắc chắn không tự động dễ đọc hơn.
Cấp, tôi để lại ba trường hợp giống hệt nhau trong /* write to a log, whatever... */ return;
ví dụ đầu tiên.
Nhưng đó là loại quan điểm của tôi. Bạn đã nghe nói về các chức năng / phương thức, phải không? Nghiêm túc. Viết một ErrorHandler
hàm chung và, giống như, gọi nó từ mỗi khối bắt.
Nếu bạn hỏi tôi, ví dụ thứ hai (với các từ khóa if
và is
cả hai đều dễ đọc hơn đáng kể và đồng thời dễ bị lỗi hơn đáng kể trong giai đoạn bảo trì dự án của bạn.
Giai đoạn bảo trì, đối với bất kỳ ai có thể tương đối mới với lập trình, sẽ chiếm 98,7% hoặc hơn trong toàn bộ thời gian thực hiện dự án của bạn, và người nghèo khó thực hiện bảo trì gần như chắc chắn sẽ là một người khác ngoài bạn. Và có một cơ hội rất tốt họ sẽ dành 50% thời gian cho công việc chửi rủa tên bạn.
Và tất nhiên FxCop vỏ vào bạn và do đó bạn phải cũng thêm một thuộc tính để mã của bạn đã chính xác nén để làm với các chương trình đang chạy, và chỉ có nói với FxCop để bỏ qua một vấn đề mà trong 99,9% các trường hợp nó là hoàn toàn đúng trong việc gắn cờ. Và xin lỗi, tôi có thể nhầm, nhưng không phải thuộc tính "bỏ qua" đó thực sự được biên dịch vào ứng dụng của bạn sao?
Sẽ đặt toàn bộ if
bài kiểm tra trên một dòng làm cho nó dễ đọc hơn? Tôi không nghĩ vậy. Ý tôi là, tôi đã có một lập trình viên khác tranh cãi kịch liệt một thời gian dài trước đây rằng việc đặt nhiều mã trên một dòng sẽ làm cho nó "chạy nhanh hơn". Nhưng tất nhiên anh ấy đã ăn hạt dẻ. Cố gắng giải thích cho anh ta (với khuôn mặt thẳng thắn - đầy thách thức) làm thế nào trình thông dịch hoặc trình biên dịch sẽ chia dòng dài đó thành các câu lệnh một dòng riêng biệt - về cơ bản giống với kết quả nếu anh ta đi trước và chỉ làm cho mã có thể đọc được thay vì cố gắng thông minh trình biên dịch - không có tác dụng gì với anh ta. Nhưng tôi lạc đề.
Điều này có thể đọc được ít hơn bao nhiêu khi bạn thêm ba loại ngoại lệ, một hoặc hai tháng kể từ bây giờ? (Trả lời: nó ít được đọc hơn nhiều ).
Một trong những điểm chính, thực sự, là hầu hết các điểm định dạng mã nguồn văn bản mà tất cả chúng ta đang xem mỗi ngày là làm cho nó thực sự, thực sự rõ ràng đối với những người khác những gì thực sự xảy ra khi mã chạy. Bởi vì trình biên dịch biến mã nguồn thành một thứ hoàn toàn khác và không quan tâm nhiều đến phong cách định dạng mã của bạn. Vì vậy, tất cả trên một dòng hoàn toàn hút, quá.
Chỉ cần nói ...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}