2013-05-30 13 views
5

là nó có thể làm điều gì đó như sau:Tái sử dụng bắt buộc với tất cả sản lượng đánh bắt

Tôi muốn bắt một ngoại lệ tùy chỉnh và làm điều gì đó với nó - dễ dàng: try {...} catch (CustomException) {...}

Nhưng sau đó tôi muốn chạy mã được sử dụng trong "tổng hợp" khối vẫn chạy một số mã khác có liên quan đến tất cả các khối catch ...

try 
{ 
    throw new CustomException("An exception."); 
} 
catch (CustomException ex) 
{ 
    // this runs for my custom exception 

throw; 
} 
catch 
{ 
    // This runs for all exceptions - including those caught by the CustomException catch 
} 

hoặc làm tôi có phải đặt bất cứ điều gì tôi muốn làm trong mọi trường hợp ngoại lệ (finally không phải là một tùy chọn bởi vì tôi muốn nó chỉ chạy cho th e ngoại lệ) vào một phương pháp riêng biệt/lồng toàn bộ thử/nắm bắt trong một phương thức khác (euch) ...?

+3

Đặt cờ trong câu lệnh bắt và sử dụng 'cuối cùng' sẽ phù hợp với bạn. Ngoài ra, hãy tính toán tất cả mã chung vào một phương thức 'CleanUpAfterException' và gọi nó ở cuối mỗi câu lệnh' catch'. – Crisfole

+0

Ah - đặt cờ và 'cuối cùng' có vẻ như là một giải pháp gọn gàng. Tôi đã không nghĩ về điều đó. – JaySeeAre

Trả lời

5

Tôi thường làm một cái gì đó dọc theo các dòng của

try 
{ 
    throw new CustomException("An exception."); 
} 
catch (Exception ex) 
{ 
    if (ex is CustomException) 
    { 
     // Do whatever 
    } 
    // Do whatever else 
} 
+0

Tôi đoán đây là gọn gàng nhất ... ít nhất là khối thử cũng không bị thụt vào. Vì nó xảy ra tôi chỉ có một phương thức gọi để làm trong cả hai trường hợp, do đó, một phương pháp riêng biệt sẽ không đạt được bất cứ điều gì. – JaySeeAre

4

Bạn cần phải sử dụng hai try khối:

try 
{ 
    try 
    { 
     throw new ArgumentException(); 
    } 
    catch (ArgumentException ex) 
    { 
     Console.WriteLine("This is a custom exception"); 
     throw; 
    } 
} 
catch (Exception e) 
{ 
    Console.WriteLine("This is for all exceptions, "+ 
     "including those caught and re-thrown above"); 
} 
+1

Tôi nghĩ về điều này, có vẻ hơi lộn xộn mặc dù - rất nhiều làm tổ! – JaySeeAre

0

Không, nó không làm theo cách này, bạn có bắt một ngoại lệ cụ thể (tuyến tính) hoặc một sự tổng quát. Nếu bạn muốn chạy một cái gì đó cho tất cả các trường hợp ngoại lệ, bạn sẽ cần lưu hồ sơ về việc có ngoại lệ hay không, có lẽ là ngoại lệ, và sử dụng finally hoặc một trường hợp khác, có thể là 'lộn xộn' và tiết, cơ chế.

1

Chỉ cần thực hiện bắt tổng thể và kiểm tra xem nếu hợp ngoại lệ là loại:

try 
{ 
    throw new CustomException("An exception."); 
} 
catch (Exception ex) 
{ 
    if (ex is CustomException) 
    { 
     // Custom handling 
    } 
    // Overall handling 
} 

Cách khác, có một phương pháp cho ngoại lệ tổng thể xử lý cả hai cuộc gọi:

try 
{ 
    throw new CustomException("An exception."); 
} 
catch (CustomException ex) 
{ 
    // Custom handling here 

    HandleGeneralException(ex); 
} 
catch (Exception ex) 
{ 
    HandleGeneralException(ex); 
}