2009-12-12 19 views
8

Tôi muốn kết hợp các khối catch trong đoạn mã sau vì lý do tái sử dụng mã:Hợp nhất các khối catch với chính xác cùng một mã?

try 
{ 
    DoSomeInputOutput(); 
} 
catch (InvalidOperationException ex) 
{ 
    HandleKnownException1(ex); 
} 
catch (InvalidDataException ex) 
{ 
    HandleKnownException1(ex); 
} 
catch (ArgumentNullException ex) 
{ 
    HandleKnownException1(ex); 
} 
catch (ArgumentOutOfRangeException ex) 
{ 
    HandleKnownException2(ex); 
} 
catch (ArithmeticException ex) 
{ 
    HandleKnownException2(ex); 
} 
catch (InvalidCastException ex) 
{ 
    HandleKnownException2(ex); 
} 
catch (Exception ex) 
{ 
    HandleUnknownException(ex); 
} 

một cái gì đó như thế này:

try 
{ 
    DoSomeInputOutput(); 
} 
catch (InvalidOperationException ex) 
catch (InvalidDataException ex) 
catch (ArgumentNullException ex) 
{ 
    HandleKnownException1(ex); 
} 
catch (ArgumentOutOfRangeException ex) 
catch (ArithmeticException ex) 
catch (InvalidCastException ex) 
{ 
    HandleKnownException2(ex); 
} 
catch (Exception ex) 
{ 
    HandleUnknownException(ex); 
} 

Là có thể bằng cách nào đó?

Cảm ơn.

Trả lời

5

Không (hoặc ít nhất: trừ khi ngoại lệ bạn muốn nhóm xảy ra để chia sẻ một lớp cơ sở chung cho nhóm đó, chúng không có trong ví dụ của bạn); điều duy nhất bạn có thể làm trong trường hợp này là catch (Exception ex) và làm thử nghiệm thời gian chạy trên ex. Khi bạn đã thực hiện điều đó, tôi hy vọng mã của bạn đã "đẹp hơn" (vì, quan trọng là bạn đã tái cấu trúc mã xử lý thành một phương thức).

tôi bị cám dỗ để tinh chỉnh khoảng cách để tôi có thể tập trung vào các mã quan trọng:

try 
{ 
    DoSomeInputOutput(); 
} 
// blah humorous scenario 1 
catch (InvalidOperationException ex) { HandleKnownException1(ex); } 
catch (InvalidDataException ex) { HandleKnownException1(ex); } 
catch (ArgumentNullException ex) { HandleKnownException1(ex); } 
// blah whimsical scenario 2 
catch (ArgumentOutOfRangeException ex) { HandleKnownException2(ex); } 
catch (ArithmeticException ex) { HandleKnownException2(ex); } 
catch (InvalidCastException ex) { HandleKnownException2(ex); } 
// unexpected comedy 
catch (Exception ex) { HandleUnknownException(ex); } 

(hoặc một cái gì đó).

Trong một số cách, điều này cũng liên quan đến câu hỏi này: switch/pattern matching idea.

1

Bạn chỉ có thể làm điều gì đó như thế này nếu bạn có một hệ thống phân cấp ngoại lệ phong nha, sau đó bạn có thể bắt một ngoại lệ của một loại cao hơn trong hệ thống phân cấp. Tuy nhiên, hệ thống phân cấp ngoại lệ có nghĩa là khá nông bằng thiết kế và không có gì đảm bảo rằng bạn sẽ muốn xử lý các ngoại lệ theo cùng một cách chỉ dựa trên cấu trúc phân cấp. Và bên cạnh đó ... không ai trong số đó sẽ giúp với các loại ngoại lệ tiêu chuẩn được sử dụng trong ví dụ của bạn.

7

Có lẽ, bạn làm điều đó ở nhiều nơi. Nếu vậy, tại sao bạn không làm điều này:

{ 
    DoSomeInputOutput(); 
} 
catch (Exception ex) 
{ 
    HandleInputException(ex); 
} 

void HandleInputException(Exception ex) 
{ 
    if (ex is InvalidOperationException || ex is InvalidDataException || ex is ArgumentNullException) 
    { 
    HandleKnownException1 (ex); 
    } 
    else if ... 
    else if ... 
} 
Các vấn đề liên quan