2010-02-18 25 views
20

Đã có câu hỏi được đăng here rất giống nhau. Tôi đang mở rộng câu hỏi đó thêm một chút. Nói rằng bạn muốn bắt nhiều loại ngoại lệ nhưng muốn xử lý nó theo cùng một cách, có cách nào để làm một cái gì đó như trường hợp chuyển đổi?try-catch. Xử lý nhiều trường hợp ngoại lệ theo cùng một cách (hoặc rơi qua)

switch (case) 
{ 
    case 1: 
    case 2: 

    DoSomething(); 
    break; 
    case 3: 
    DoSomethingElse() 
    break; 

} 

Có thể xử lý một vài ngoại lệ theo cùng một cách. Một cái gì đó như

try 
{ 
} 
catch (CustomException ce) 
catch (AnotherCustomException ce) 
{ 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
} 
catch (SomeOtherException ex) 
{ 
//Do Something else 
} 
+0

có thể trùng lặp của [Bắt nhiều ngoại lệ cùng một lúc?] (Http://stackoverflow.com/questions/136035/catch-multiple-exceptions-at-once) – nawfal

Trả lời

15

Hiện tại không có cấu trúc ngôn ngữ để thực hiện những gì bạn muốn. Trừ khi ngoại lệ tất cả bắt nguồn từ một ngoại lệ cơ sở, bạn cần phải xem xét tái cấu trúc logic chung cho một phương thức và gọi nó từ các trình xử lý ngoại lệ khác nhau.

Hoặc bạn có thể làm như được giải thích trong câu hỏi này:

Catch multiple Exceptions at once?

Cá nhân tôi có xu hướng thích cách tiếp cận phương pháp dựa trên.

+2

Để sao chép dữ liệu vào chủ đề này: 'catch (Ngoại lệ) ví dụ: { nếu (ví dụ là FormatException || ex là OverflowException) { WebId = Guid.Empty; trả lại; } ném; } ' –

7

Bạn thực sự nên có BaseCustomException và nắm bắt điều đó.

0

Bạn không nên bắt nhiều ngoại lệ tùy chỉnh này, tuy nhiên nếu bạn muốn, bạn có thể tạo một số phổ biến BaseException và nắm bắt điều đó.

+0

Tại sao không? Có thể có 3 thư viện tùy chỉnh có hiệu lực trong khối try try. – Gusdor

+0

bạn nói đúng, nói chung hoàn toàn tốt đẹp của nó để bắt được nhiều ngoại lệ tùy chỉnh như bạn cần, trên thực tế nó được ưa thích, nếu bạn xử lý tất cả khác nhau. –

-5

Tôi chưa bao giờ thực sự làm điều này hay bất cứ thứ gì như nó, và tôi không có quyền truy cập vào một trình biên dịch cho mục đích thử nghiệm nhưng chắc chắn một cái gì đó như thế này sẽ làm việc. Bạn không chắc chắn làm thế nào để thực sự làm so sánh kiểu hoặc nếu C# sẽ cho phép bạn thay thế các câu lệnh if bằng một câu lệnh case.

try 
{ 
} 
catch (System.Object obj) 
{ 
    Type type; 

    type = obj.GetType() ; 
    if (type == CustomException || type == AnotherCustomException) 
    { 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
    } 
    else if (type == SomeOtherException ex) 
    { 
    //Do Something else 
    } 
    else 
    { 
    // Wasn't an exception to handle here 
    throw obj; 
    } 
} 
+0

Điều này có thể làm việc, nhưng đây không phải là một giải pháp tốt, vì nó bỏ qua hai sự kiện rất cơ bản: a) có một hệ thống cơ bản Exception lớp, và bạn không cần phải đi tất cả các con đường xuống System.Object; và b) nhiều câu lệnh khai thác cho các lớp ngoại lệ khác nhau tồn tại cho mục đích này. –

+0

Tôi đồng ý với Allison R về điểm (a), nhưng liên quan đến điểm (b) nó có vẻ như chỉ trích trả lời câu hỏi đã được hỏi. – torak

+2

Chia nhỏ chức năng chung thành một phương thức và gọi nó trong các khối 'catch()' là cách thanh lịch hơn, vì nó không yêu cầu kiểm tra kiểu và sử dụng đúng cấu trúc ngôn ngữ gốc để xử lý ngoại lệ. –

1

Trong vb.net, người ta có thể sử dụng bộ lọc ngoại lệ để nói, ví dụ:

 
    Catch Ex As Exception When TypeOf Ex is ThisException Or TypeOf Ex is ThatException 

Thật không may, vì lý do nào đó, những người triển khai C# vẫn chưa cho phép viết mã lọc ngoại lệ trong C#.

3

Đây là copied from another posting, nhưng tôi kéo mã vào chủ đề này:

Catch System.Exception và chuyển đổi về các loại

catch (Exception ex)    
{     
    if (ex is FormatException || ex is OverflowException) 
    { 
     WebId = Guid.Empty; 
     return; 
    } 

    throw; 
} 

Tôi thích này để lặp lại một lời gọi phương thức trong một số khối catch.

Các vấn đề liên quan