2013-06-26 33 views
21

Tôi gặp sự cố với mã của mình trong khối thử. Để làm cho nó dễ dàng đây là mã của tôi:Nhiều mã thử trong một khối

try: 
    code a 
    code b #if b fails, it should ignore, and go to c. 
    code C#if c fails, go to d 
    code d 
except: 
    pass 

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

+1

Để được rõ ràng, bạn muốn 'đang c' được thực hiện * chỉ khi mã b đặt ra một ngoại lệ *? –

+0

Tất cả các mã sẽ được chạy, trong một khối thử, ngay cả khi chúng tăng ngoại lệ. – arvidurs

+0

Bạn không thể có điều đó. Một khối 'try' không có để ngăn chặn các ngoại lệ trên tất cả các mã được thi hành. Nó sẽ cho phép bạn * bắt * ngoại lệ khi nó xảy ra, nhưng phần còn lại của khối không bao giờ được thực hiện. –

Trả lời

30

Bạn sẽ phải làm cho điều này riêngtry khối:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    try: 
     code c 
    except ExplicitException: 
     try: 
      code d 
     except ExplicitException: 
      pass 

này giả định bạn muốn chạy code cchỉ nếu code b thất bại.

Nếu bạn cần phải chạy code cbất, bạn cần phải đặt các try khối một sau khi khác:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    pass 

try: 
    code c 
except ExplicitException: 
    pass 

try: 
    code d 
except ExplicitException: 
    pass 

Tôi đang sử dụng except ExplicitException ở đây vì nó là bao giờ một thực hành tốt để một cách mù quáng bỏ qua tất cả các ngoại lệ. Bạn cũng sẽ bỏ qua MemoryError, KeyboardInterruptSystemExit nếu không, bạn thường không muốn bỏ qua hoặc ngăn chặn mà không có một số loại lý do nâng cao hoặc có ý thức để xử lý chúng.

+0

xử lý ngoại lệ của Python chỉ là quá xấu xí, nó làm cho bạn viết mã mà khóc cho các macro kiểu C. – Elazar

+3

@Elazar: Khi mã của bạn bắt đầu trông giống như trên, bạn thực sự muốn suy nghĩ lại những gì bạn đang làm. Với các trình quản lý ngữ cảnh và một số phép tái cấu trúc, hầu hết mã xử lý ngoại lệ có thể được thực hiện dễ đọc hơn và dễ bảo trì hơn. –

+0

Câu hỏi là, tôi nên suy nghĩ lại nó chỉ vì nó là python vì vậy tôi phải sử dụng cả hai trường hợp ngoại lệ và thụt đầu dòng. Bốn thao tác đơn giản, mỗi thao tác chỉ thực hiện nếu lần cuối không thành công và bạn nhận được 4 mức thụt đầu dòng. uh. Nếu ngoại lệ là tốt, việc sử dụng chúng nên được khuyến khích bằng cú pháp. – Elazar

3

Trích xuất (tái cấu trúc) các câu lệnh của bạn. Và sử dụng phép thuật của andor để quyết định thời điểm đoản mạch.

def a(): 
    try: # a code 
    except: pass # or raise 
    else: return True 

def b(): 
    try: # b code 
    except: pass # or raise 
    else: return True 

def c(): 
    try: # c code 
    except: pass # or raise 
    else: return True 

def d(): 
    try: # d code 
    except: pass # or raise 
    else: return True 

def main(): 
    try: 
     a() and b() or c() or d() 
    except: 
     pass 
+1

'ngoại trừ: tăng'? Có điểm gì trong đó? Ngoại lệ sẽ vẫn hủy các cuộc gọi còn lại. –

+0

Nó được nhận xét, phụ thuộc nếu anh ta muốn nó tiếp tục hoặc dừng lại. –

+1

Tôi nghĩ một người trang trí sẽ phù hợp ở đây. – Elazar

1

Nếu bạn không muốn chuỗi (một số lượng lớn) thử ngoại trừ các điều khoản, bạn có thể thử mã của bạn trong vòng lặp và phá vỡ khi thành công thứ nhất.

Ví dụ với mã mà có thể được đưa vào chức năng:

for code in (
    lambda: a/b, 
    lambda: a/(b + 1), 
    lambda: a/(b + 2), 
    ): 
    try: print(code()) 
    except Exception as ev: continue 
    break 
else: 
    print("it failed: %s" % ev) 

Ví dụ với mã tùy ý (báo cáo) trực tiếp trong phạm vi hiện tại:

for i in 2, 1, 0: 
    try: 
     if i == 2: print(a/b) 
     elif i == 1: print(a/(b + 1)) 
     elif i == 0: print(a/(b + 2)) 
     break   
    except Exception as ev: 
     if i: 
      continue 
     print("it failed: %s" % ev) 
Các vấn đề liên quan