2012-12-14 34 views
11

tôi muốn làm:Làm thế nào để viết nhiều câu lệnh thử trong một khối trong python?

try: 
    do() 
except: 
    do2() 
except: 
    do3() 
except: 
    do4() 

Nếu làm() thất bại, thực hiện DO2(), nếu DO2() không quá, exceute do3() và vân vân.

Trân trọng

+4

Tôi có một cảm giác rằng mô tả trường hợp sử dụng cụ thể của bạn sẽ dẫn đến một câu trả lời với một giải pháp thanh lịch hơn ... – Triptych

Trả lời

9

Tôi muốn viết một hàm wrapper nhanh first() cho điều này.

sử dụng: value = first([f1, f2, f3, ..., fn], default='All failed')

#!/usr/bin/env 


def first(flist, default=None): 

    """ Try each function in `flist` until one does not throw an exception, and 
    return the return value of that function. If all functions throw exceptions, 
    return `default` 

    Args: 
     flist - list of functions to try 
     default - value to return if all functions fail 

    Returns: 
     return value of first function that does not throw exception, or 
     `default` if all throw exceptions. 

    TODO: Also accept a list of (f, (exceptions)) tuples, where f is the 
    function as above and (exceptions) is a tuple of exceptions that f should 
    expect. This allows you to still re-raise unexpected exceptions. 
    """ 

    for f in flist: 
     try: 
      return f() 
     except: 
      continue 
    else: 
     return default 

# Testing. 

def f(): 
    raise TypeError 

def g(): 
    raise IndexError 

def h(): 
    return 1 


# We skip two exception-throwing functions and return value of the last. 
assert first([f, g, h]) == 1 

assert first([f, g, f], default='monty') == 'monty' 
0

Bạn nên chỉ định loại ngoại lệ bạn đang cố gắng nắm bắt mỗi lần.

try: 
    do() 
except TypeError: #for example first one - TypeError 
    do_2() 
except KeyError: #for example second one - KeyError 
    do_3() 

v.v.

+0

Nếu tôi không biết loại trừ? – alwbtc

+2

@alwbic: Nếu bạn không biết loại ngoại lệ, bạn không biết cách xử lý ngoại lệ. – BrenBarn

+0

@alwbic Tôi thực sự chắc chắn rằng bạn phải biết loại (các) trường hợp ngoại lệ nào bạn mong đợi. – alexvassel

21

Nếu bạn thực sự không quan tâm đến các trường hợp ngoại lệ, bạn lặp qua các trường hợp cho đến khi bạn có thể thành công:

for fn in (do, do2, do3, do4): 
    try: 
     fn() 
     break 
    except: 
     continue 

này ít nhất tránh được việc phải thụt một lần cho mọi trường hợp. Nếu các hàm khác nhau cần các đối số khác nhau, bạn có thể sử dụng functools.partial để 'nguyên tố' chúng trước vòng lặp.

+1

'pass' nên là' tiếp tục' có lẽ? Hoạt động như văn bản nhưng 'tiếp tục' là rõ ràng về mặt ngữ nghĩa. – Triptych

+0

@Triptych Đúng, điều đó có ý định tín hiệu tốt hơn. Câu trả lời đã chỉnh sửa. –

4

Nó có vẻ như là một điều thực sự kỳ lạ để muốn làm, nhưng tôi có lẽ vòng qua các chức năng và phá vỡ ra khi không có ngoại lệ huy động:

for func in [do, do2, do3]: 
    try: 
     func() 
    except Exception: 
     pass 
    else: 
     break 
0

Đây là cách đơn giản nhất tôi tìm thấy, chỉ cần nhúng thử dưới trước trừ.

try: 
    do() 
except: 
    try: 
     do2() 
    except: 
     do3() 
-1
import sys 

try: 
    f = open('myfile.txt') 
    s = f.readline() 
    i = int(s.strip()) 
except OSError as err: 
    print("OS error: {0}".format(err)) 
except ValueError: 
    print("Could not convert data to an integer.") 
except: 
    print("Unexpected error:", sys.exc_info()[0]) 
    raise 
+1

Điều này không trả lời được câu hỏi nào cả! –

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