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
'programing' 카테고리의 다른 글
php-7로 업그레이드한 후 "정의되지 않은 함수 mysql_connect()로 호출" (0) | 2023.07.26 |
---|---|
뮤텍스 잠금 스레드 (0) | 2023.07.26 |
Prepared Statement + 업데이트를 위해 선택 + 기본 키 열에 Oracle 12c + ORA-01461 (0) | 2023.07.26 |
SQL Developer 오류 Java 가상 시스템을 찾을 수 없습니다. (0) | 2023.07.26 |
CSV 파일 팬더를 읽을 때 열 이름 지정 (0) | 2023.07.26 |