하나의 블록에 여러 개의 시도 코드가 있음
시도 블록에 있는 내 코드에 문제가 있습니다.쉽게 설명하기 위해 제 코드는 다음과 같습니다.
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
이런 일이 가능합니까?
당신은 이것을 따로 만들어야 할 것입니다. try
블록:
try:
code a
except ExplicitException:
pass
try:
code b
except ExplicitException:
try:
code c
except ExplicitException:
try:
code d
except ExplicitException:
pass
이는 실행하려는 경우를 가정합니다.code c
경우에 한하여code b
실패한
실행해야 하는 경우code c
어쨌든, 당신은 그것을 넣을 필요가 있습니다.try
블록이 차례로 표시됩니다.
try:
code a
except ExplicitException:
pass
try:
code b
except ExplicitException:
pass
try:
code c
except ExplicitException:
pass
try:
code d
except ExplicitException:
pass
사용 중except ExplicitException
모든 예외를 맹목적으로 무시하는 것은 결코 좋은 관행이 아니기 때문입니다.당신은 무시할 것입니다.MemoryError
,KeyboardInterrupt
그리고.SystemExit
그렇지 않으면, 일반적으로 무시하거나 차단하고 싶지 않은 이유는 이러한 것들을 처리하는 데 필요한 어떤 종류의 재실행 또는 의식적인 이유가 없습니다.
fuckit 모듈을 사용할 수 있습니다.
다음을 사용하여 코드를 함수로 감쌉니다.@fuckit
장식자:
@fuckit
def func():
code a
code b #if b fails, it should ignore, and go to c.
code c #if c fails, go to d
code d
진술을 추출(리팩터링)합니다.그리고 마법을 사용합니다.and
그리고.or
단락 시기를 결정합니다.
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
만약 당신이 (엄청난 수의) try-except 절을 연결하고 싶지 않다면, 당신은 당신의 코드를 반복해서 시도하고 첫 번째 성공을 거둘 수 있습니다.
함수에 넣을 수 있는 코드의 예:
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)
현재 스코프에서 직접 임의 코드(문)를 사용하는 예:
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)
각 코드가 함수이고 이미 작성되었다고 가정하면, "브레이크"를 사용하여 오류 없이 함수가 실행될 때 다음을 사용하여 코딩 목록을 반복하고 for-loop을 종료할 수 있습니다.
def a(): code a
def b(): code b
def c(): code c
def d(): code d
for func in [a, b, c, d]: # change list order to change execution order.
try:
func()
break
except Exception as err:
print (err)
continue
여기서 "예외"를 사용하여 인쇄된 오류를 확인할 수 있습니다.무엇을 기대해야 하는지 알고 있고 관심이 없으면 인쇄를 끕니다(예: 코드가 두 개 또는 세 개의 목록 항목(i,j = msg.msg.").
당신은 for 루프를 시도할 수 있습니다.
for func,args,kwargs in zip([a,b,c,d],
[args_a,args_b,args_c,args_d],
[kw_a,kw_b,kw_c,kw_d]):
try:
func(*args, **kwargs)
break
except:
pass
이렇게 하면 코드를 보기 흉하게 만들지 않고 원하는 만큼의 기능을 루프할 수 있습니다.
저는 이 문제에 부딪혔지만, 그것은 반복적으로 그것을 발행하는 간단한 사례로 만들었습니다.continue
명령을 실행합니다.루프에 있지 않다면 적어도 경우에 따라 그 기술을 재사용할 수 있다고 생각합니다.
while True:
try:
code_a
break
except:
pass
try:
code_b
break
except:
pass
etc
raise NothingSuccessfulError
새 변수를 사용하여 다른 방법을 사용합니다.
continue_execution = True
try:
command1
continue_execution = False
except:
pass
if continue_execution:
try:
command2
except:
command3
명령을 더 추가하려면 다음과 같은 식을 더 추가하면 됩니다.
try:
commandn
continue_execution = False
except:
pass
Elazar가 제안한 것처럼 "여기에 장식가가 어울릴 것 같습니다."
# decorator
def test(func):
def inner(*args, **kwargs):
try:
func(*args, **kwargs)
except: pass
return inner
# code blocks as functions
@test
def code_a(x):
print(1/x)
@test
def code_b(x):
print(1/x)
@test
def code_c(x):
print(1/x)
@test
def code_d(x):
print(1/x)
# call functions
code_a(0)
code_b(1)
code_c(0)
code_c(4)
출력:
1.0
0.25
언급URL : https://stackoverflow.com/questions/17322208/multiple-try-codes-in-one-block
'programing' 카테고리의 다른 글
'root@localhost' 사용자에 대한 액세스가 거부되었습니다(암호 사용:아니오) (0) | 2023.08.05 |
---|---|
오류와 함께 npm 설치 오류: ENOENT, chmod (0) | 2023.08.05 |
Android:제목 없이 대화 상자를 만드는 방법은 무엇입니까? (0) | 2023.08.05 |
sqlalchemy back_pumulates는 언제 사용해야 합니까? (0) | 2023.08.05 |
전체 폴더 및 내용을 삭제하는 방법은 무엇입니까? (0) | 2023.07.31 |