2012-05-03 31 views
18

Tôi tự hỏi, có cách nào để chỉ thực hiện một khối nếu không có ngoại lệ đã được ném?Hãy thử bắt cuối cùng: Làm điều gì đó nếu không có ngoại lệ được ném

Điều tốt nhất tôi có thể đưa ra là thế này:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
}finally{ 
    if(!exception){ 
     // i can do what i want here 
    } 
} 

Có cách nào tốt hơn?

+0

Bạn có bất kỳ "trở lại" nào trong khối thử không? – Guillaume

+0

Câu trả lời có 18 phiếu bầu giữa họ và câu hỏi 1 phiếu bầu? –

+0

@Guillaume không trả lại – lowerkey

Trả lời

33

Chắc chắn có: đặt nó ở cuối khối try.

try{ 
    // something 
    // i can do what i want here 
}catch(Exception e){ 
    // handle exception 
} 

Điều này không hoàn toàn tương đương với mã ban đầu của bạn theo nghĩa "nếu bạn muốn" ném, ngoại lệ sẽ bị bắt tại địa phương (điều này sẽ không xảy ra với kế hoạch ban đầu của bạn). Đây là một cái gì đó bạn có thể hoặc có thể không quan tâm, và có một cơ hội tốt mà các hành vi khác nhau cũng là một trong những chính xác.

Nếu bạn muốn mang lại cho các hành vi cũ trở lại, bạn cũng có thể sử dụng biến thể này mà không đòi hỏi một finally chỉ vì lợi ích của văn bản "nếu không có ngoại lệ" tình trạng:

var checkpointReached = false; 
try{ 
    // something 
    checkpointReached = true; 
    // i can do what i want here 
}catch(Exception e){ 
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint 
    // handle exception 
} 
+0

+1, câu trả lời hay. –

+0

Với vấn đề là nếu bạn lặp lại mẫu này, bạn sẽ có được sự cố gắng bắt giữ. Vì vậy, nó chỉ được đề nghị nếu bạn có vài trường hợp ngoại lệ dự kiến. –

+0

@dystroy: Không chắc chắn ý bạn là gì, bạn có thể xây dựng được không? – Jon

3

Bạn don không cần mệnh đề cuối cùng.

Một giải pháp:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
} 
if(!exception){ 
    // u can do what u want here 
} 

Thông thường, bạn sẽ chỉ cần có một sự trở lại trong mệnh đề catch của bạn để bạn thậm chí không có để kiểm tra:

try{ 
    // something 
}catch(Exception e){ 
    // do things 
    return; 
} 
// u can do what u want here 

hoặc (tùy thuộc vào việc sử dụng trường hợp và nói chung ít rõ ràng hơn, đặc biệt nếu bạn có nhiều hơn một ngoại lệ được mong đợi - bạn không muốn có sự cố gắng bắt giữ ...):

try{ 
    // something 
    // u can do what u want here 
}catch(Exception e){ 
    // do things 
} 
1

Không - những gì bạn đã có có lẽ là cách tốt nhất để làm điều đó trong C#.

này được giả định rằng:

  • Bạn không muốn "tôi có thể làm những gì tôi muốn ở đây" mã để chạy ở dưới cùng của try khối của bạn. (Có lẽ vì bạn không muốn ngoại lệ trong mã đó được xử lý bởi khối chính catch.)
  • Bạn không muốn mã số "tôi có thể làm những gì tôi muốn ở đây" để chạy hoàn toàn bên ngoài try...catch...finally kết cấu. (Có lẽ vì bạn muốn mã mà chạy trước một số mã khác mà ngồi bên trong khối finally.)
4

Bạn có thể cấu trúc mã của bạn rằng doSomething là báo cáo kết quả cuối cùng trong khối và nó không ném?

bool exception = false; 
try{ 
    // something 
    doSomething(); 
} catch { 
} 
finally { 
} 
+0

@ Jeff Fosterno cần cuối cùng chặn ở đây. –

+1

Tôi cho rằng có một số mã dọn dẹp boilerplate đã luôn muốn chạy. Nếu không, thì bạn chắc chắn đúng, nó dư thừa. –

2

Có có: đặt nó ở phần cuối của khối try :)

1

Trong khi không có gì sai với mã của bạn, đó là không cần thiết.Đơn giản chỉ cần đặt mã bạn muốn thực hiện ở dưới cùng của khối try:

try { 
    ... 
    // No errors to this point, run what you wanted to run in the finally. 
} 
catch(Exception e) { 
    ... 
} 
0

Tôi tin rằng bạn đang tìm kiếm một thử bên trong cố gắng của bạn:

try{ 
    // something 

    try{ 
     // something else not interfering with first try 
    } catch(Exception innerEx){ 
     // something else threw this innerEx 
    } 

}catch(Exception outerEx){ 
    // something threw this outerEx 
} 

Mặc dù điều này thường được coi là xấu thực tế, Tôi thích nó hơn phiên bản cờ.

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