2012-02-16 24 views
11

Tôi tự hỏi có thể try..catch thực thi lực lượng để đi vào mã số catch và chạy trong đó không?Làm thế nào tôi có thể bắt buộc thực hiện khối catch?

đây mã ví dụ:

try { 
    if (AnyConditionTrue) { 
     // run some code 
    } 
    else { 
     // go catch 
    } 
} catch (Exception) { 
    // run some code here... 
} 
+1

Bạn có nghĩa là giống như nâng một ngoại lệ trong các báo cáo khác? Chắc chắn rồi. Nó không phải là cách tốt nhất để thiết kế ứng dụng của bạn nhưng nó là có thể.Chỉ cần làm một ngoại lệ mới ném ("Đây là một ngoại lệ đơn giản"); – IAmTimCorey

+3

'ném ngoại lệ mới (" Một số thông điệp ")' –

+2

Bạn có thể ném ngoại lệ cho người khác, nhưng bạn không nên sử dụng ngoại lệ cho luồng điều khiển. – cadrell0

Trả lời

21

Thay vì ném một ngoại lệ trong else, tôi muốn giới thiệu giải nén mã từ catch của bạn thành một phương pháp và gọi đó là từ bạn khác

try 
{ 
    if (AnyConditionTrue) 
    { 
     MethodWhenTrue(); 
    } 
    else 
    { 
     HandleError(); 
    } 
} 
catch(Exception ex) 
{ 
    HandleError(); 
} 
+1

theo ý kiến ​​của tôi, tôi vẫn thích 'ném ngoại lệ mới' vì có thể có một số mã bên dưới 'if ... else ...' mà tôi không muốn thực thi chúng bất cứ khi nào Lỗi xuất hiện – Jacky

+0

@ Jacky Nếu có mã bạn không muốn thực thi khi có một ngoại lệ, mã phải nằm trong khối thử. Nếu bạn không muốn nó thực hiện trong điều kiện khác, tại sao không phải là nó trong if? – cadrell0

+0

Hãy xem ví dụ của tôi https://dotnetfiddle.net/EN1Wd2 Tôi không muốn mã chạy đến dòng 18, vì toàn bộ hàm của tôi 'try ... catch ...' có thể chứa nhiều 'nếu ... khác ... ' – Jacky

20
try{ 
     if (AnyConditionTrue){ 
       //run some code 
       } 
     else{ 
       throw new Exception(); 
      } 
    } 
    catch(){ 

     //run some code here... 

    } 

Nhưng giống như Yuck đã tuyên bố, tôi sẽ không đề nghị này. Bạn nên lùi lại một bước về thiết kế của bạn và những gì bạn đang tìm kiếm để đạt được. Có một cách tốt hơn để làm điều đó (tức là với luồng điều kiện thông thường, thay vì xử lý ngoại lệ).

+0

+1 Vì nó * có * trả lời câu hỏi về cách bạn sẽ thực hiện. Đối với dòng điều khiển, đây là thực hành không tốt, như bạn đã đề cập. Thật hiếm khi bạn cần phải ném một ngoại lệ để bị bắt bởi cùng một cấu trúc 'try..catch'. – Yuck

1

Có, nếu bạn throw ngoại lệ bạn dự định catch từ trong lần thử, nó sẽ bị bắt trong phần bắt.

Tôi phải hỏi bạn tại sao bạn muốn thực hiện việc này? Xử lý ngoại lệ không có nghĩa là thay thế cho luồng điều khiển.

0

Bạn có thể ném một ngoại lệ để buộc một nắm bắt

throw new Exception(...); 
0

tại sao bạn bắt một ngoại lệ? Tại sao không chỉ chạy mã trong khối "khác" của bạn? Nếu bạn phải làm nó như vậy, chỉ cần ném một ngoại lệ mới

throw new Exception(); 
6

Vâng, bạn phải ném ngoại lệ:

try 
    { 
    throw new Exception("hello"); 
    } 
    catch (Exception) 
    { 

    //run some code here... 
    } 
+1

Mặc dù đây không phải là cách tốt nhất để làm những gì OP cần làm, đó là giải pháp đơn giản cho câu hỏi được hỏi bởi OP. –

1

Tôi nghĩ rằng những gì bạn muốn là một khối finally: http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx

xem này

try 
{ 
    doSomething(); 
} 
catch 
{ 
    catchSomething(); 
    throw an error 
} 
finally 
{ 
    alwaysDoThis(); 
} 

Điều này khác nếu/khi bạn làm điều này:

try 
{ 
    doSomething(); 
} 
catch 
{ 
    catchSomething(); 
    throw an error 
} 
    alwaysDoThis();// will not run on error (in the catch) condition 

trường hợp cuối cùng này, nếu xảy ra lỗi, bắt giữ sẽ thực thi nhưng KHÔNG phải là alwaysDoThis();. Tất nhiên bạn vẫn có thể có nhiều catch như mọi khi.

+0

Câu hỏi muốn mã chỉ chạy nếu AnyConditionTrue là sai hoặc một ngoại lệ được ném. Cuối cùng sẽ chạy ngay cả khi AnyConditionTrue là đúng và không có ngoại lệ nào được ném. Bạn có thể thêm một nếu để kiểm tra AnyConditionTrue sai, nhưng điều đó sẽ không đáp ứng AnyConditionTrue là đúng và một ngoại lệ được ném. – cadrell0

+0

Dĩ nhiên nếu bạn kéo phích cắm trên nguồn, bạn có trạng thái thực thi không xác định. –

+0

@ cadrell0 - vâng, hiểu, chỉ cần thêm ví dụ này trong trường hợp giải quyết vấn đề - KHÔNG được thực hiện điều khiển luồng theo cách này nhưng DO theo cách được mô tả NẾU nó là TRULY một điều kiện lỗi và không đơn giản là điều khiển luồng này thích hợp. –

1

Như cadrel nói, nhưng đi qua một ngoại lệ để cung cấp thêm thông tin phản hồi, trong đó sẽ được hiển thị trong InnerException:

try 
{ 
    if (AnyConditionTrue) 
    { 
     MethodWhenTrue(); 
    } 
    else 
    { 
     HandleError(new Exception("AnyCondition is not true")); 
    } 
} 
catch (Exception ex) 
{ 
    HandleError(ex); 
} 

...

private void HandleError(Exception ex) { 
    throw new ApplicationException("Failure!", ex); 
} 
0
if(conditiontrue) 
{ 

} 
else{ 
    throw new Exception(); 
} 
1

Nếu bạn muốn "ép" một catch, chỉ cố làm điều gì đó ngu ngốc, như thế này:

List<string> cc = null; 
foreach (string c in cc) {} 
Các vấn đề liên quan