programing

Python에서 예외를 포착하고 시도 블록을 계속합니다.

bestprogram 2023. 7. 26. 22:15

Python에서 예외를 포착하고 시도 블록을 계속합니다.

다시실수있까니습할을 하는 것으로 수 ?try예외 발생 후 차단?

예:

try:
    do_smth1()
except:
    pass

try:
    do_smth2()
except:
    pass

대.

try:
    do_smth1()
    do_smth2()
except:
    ??? # magic word to proceed to do_smth2() if there was exception in do_smth1

아니요, 그렇게 하시면 안 됩니다.그것이 바로 파이썬의 구문입니다.예외로 인해 시도 블록을 종료하면 다시 들어갈 방법이 없습니다.

그럼 포 루프는 어때요?

funcs = do_smth1, do_smth2

for func in funcs:
    try:
        func()
    except Exception:
        pass  # or you could use 'continue'

단, 맨 옷을 입는 것은 나쁜 관행으로 간주됩니다.except대신 특정 예외를 파악해야 합니다.캡처한 것은Exception왜냐하면 그것은 방법이 어떤 예외를 초래할지 모르는 상태에서 제가 할 수 있는 만큼의 일이기 때문입니다.

다른 답변과 승인된 답변이 정확하고 실제 코드에서 따라야 하지만 완전성과 유머를 위해 다음을 시도할 수 있습니다.fuckitpy( https://github.com/ajalt/fuckitpy ) 모듈.

코드를 다음으로 변경할 수 있습니다.

@fuckitpy
def myfunc():
    do_smth1()
    do_smth2()

그 때 부르는 것myfunc()을 부를 것입니다do_smth2()에 .do_smth1())

참고: 실제 코드로 시도하지 마십시오. 신성 모독입니다.

원하는 것을 달성할 수 있지만 구문은 다릅니다.try/except 후 "finally" 블록을 사용할 수 있습니다.이렇게 하면 python은 예외가 발생했는지 여부에 관계없이 코드 블록을 실행합니다.

다음과 같이:

try:
    do_smth1()
except:
    pass
finally:
    do_smth2()

그러나 예외가 발생하지 않은 경우에만 do_smth2()를 실행하려면 "else" 블록을 사용합니다.

try:
    do_smth1()
except:
    pass
else:
    do_smth2()

try/except/else/final 절에서도 혼합할 수 있습니다.재미있게 보내!

'except' 또는 'except' 내에서는 시도 블록이 루프에 있는 경우에만 'except'를 사용할 수 있습니다.'loop'은 루프의 다음 반복을 시작하게 합니다.

따라서 두 개 이상의 함수를 목록에 넣고 루프를 사용하여 함수를 호출할 수 있습니다.

다음과 같이:

funcs = [f,g]
for func in funcs:
    try: func()
    except: continue

자세한 내용은 이 링크를 참조하십시오.

당신은 당신의 방법을 반복할 수 있습니다.

for m in [do_smth1, do_smth2]:
    try:
        m()
    except:
        pass

당신이 이것을 처리할 수 있는 한 가지 방법은 발전기를 사용하는 것입니다.함수를 호출하는 대신 함수를 반환합니다. 그러면 제너레이터를 소비하는 모든 것이 제너레이터로 호출하는 결과를 다시 전송하거나 제너레이터가 고장난 경우 센티널로 전송할 수 있습니다.위 사항을 달성하는 트램펄린은 다음과 같이 보일 수 있습니다.

def consume_exceptions(gen):
    action = next(gen)
    while True:
        try:
            result = action()
        except Exception:
            # if the action fails, send a sentinel
            result = None

        try:
            action = gen.send(result)
        except StopIteration:
            # if the generator is all used up, result is the return value.
            return result

이와 호환되는 제너레이터는 다음과 같습니다.

def do_smth1():
    1 / 0

def do_smth2():
    print "YAY"

def do_many_things():
    a = yield do_smth1
    b = yield do_smth2
    yield "Done"
>>> consume_exceptions(do_many_things())
YAY

:do_many_things()호출하지 않음do_smth*그것들은 그저 그들을 산출하고,consume_exceptions그것을 대신하여 그들을 부릅니다.

당신은 이걸 하고 싶지 않을 것 같아요.올바른 사용 방법try일반적으로 진술은 가능한 한 정확합니다.제 생각에는 다음과 같이 하는 것이 좋을 것 같습니다.

try:
    do_smth1()
except Stmnh1Exception:
    # handle Stmnh1Exception

try:
    do_smth2()
except Stmnh2Exception:
    # handle Stmnh2Exception

이 작업을 수행해야 하는 위치와 빈도에 따라 다음과 같은 작업을 수행하는 기능을 작성할 수도 있습니다.

def live_dangerously(fn, *args, **kw):
    try:
        return fn(*args, **kw)
    except Exception:
        pass

live_dangerously(do_smth1)
live_dangerously(do_smth2)

하지만 다른 대답들이 지적했듯이, null을 갖는 것은except일반적으로 코드에 다른 문제가 있다는 신호입니다.

이 작업은 다음을 통해 수행할 수 있습니다.exec()사용자 정의 함수, 문자열 목록 및for고리.

와의 함수는exec():

def try_it(string):
    try:
        exec(string)
        print(f'Done: {string}')
    except:
        print(f'Error. Could not do: {string}')

exec()에 대한 자세한 내용:
exec(개체)
이 함수는 Python 코드의 동적 실행을 지원합니다.개체는 문자열 또는 코드 개체여야 합니다.

문자열 목록의 예 및for루프:

do_smth_list = ['do_smth1()', 'do_smth2()', 'do_smth3()'] 

for smth in do_smth_list:
    try_it(smth)

이 방법이 가장 깨끗한 방법은 아니지만 변수를 true로 설정한 상태에서 잠시 루프에 넣을 수 있습니다. 함수가 성공적으로 실행되면 변수를 false로 설정하고 실패하면 변수를 true로 설정합니다.

x = True
while x == True:
    try:
        do_smth1()
        do_smth2()
        x = False
    except Exception:
        x = True

이렇게 되면 x가 false로 설정되고 루프가 중지될 때까지 while 루프는 섹션을 제외한 시도를 계속 반복합니다.

또한 다음과 같이 변수를 기반으로 하지 않고 while 루프에 브레이크를 구현할 수 있습니다.

while True:
    try:
        do_smth1()
        do_smth2()
        break
    except Excpetion:
        pass

P.S 예외 섹션에 대해 특정 예외를 두는 것이 아니라 예외 섹션에 대해 특정 예외를 두는 것이 좋습니다.코드를 더 깨끗하게 만들고 특히 더 큰 프로젝트에서 오류를 관리할 때 더 현명합니다.

try-except 반복을 방지하기 위한 special_func:

def special_func(test_case_dict):
    final_dict = {}
    exception_dict = {}

    def try_except_avoider(test_case_dict):

        try:
            for k,v in test_case_dict.items():
                final_dict[k]=eval(v) #If no exception evaluate the function and add it to final_dict

        except Exception as e:
            exception_dict[k]=e #extract exception
            test_case_dict.pop(k)
            try_except_avoider(test_case_dict) #recursive function to handle remaining functions

        finally:  #cleanup
            final_dict.update(exception_dict)
            return final_dict #combine exception dict and  final dict

    return try_except_avoider(test_case_dict) 

실행 코드:

def add(a,b):
    return (a+b)
def sub(a,b):
    return (a-b)
def mul(a,b):
    return (a*b)

case = {"AddFunc":"add(8,8)","SubFunc":"sub(p,5)","MulFunc":"mul(9,6)"}
solution = special_func(case)

출력은 다음과 같습니다.

{'AddFunc': 16, 'MulFunc': 54, 'SubFunc': NameError("name 'p' is not defined")}

변수로 변환하는 방법

locals().update(solution)

변수는 다음과 같습니다.

AddFunc = 16, MulFunc = 54, SubFunc = NameError("name 'p' is not defined")

do_smth1()이 작동하면 do_smth2()는 시도되지 않습니다.

try:
    x=do_smth1()
except:
    try:
        x=do_smth2()
    except:
        x="Both Failed"

print (x)

언급URL : https://stackoverflow.com/questions/19522990/catch-exception-and-continue-try-block-in-python