. 예컨대 코드이 변수를 할당 받고, 파이썬 예외 handeling
try:
a=b
c=d
e=f
except:
bla bla
인 예외는 것이 가능 "E = F"I 여전히 = B와 C를 원하는 = D
발생되면? 내가 여러 번 try 문을 만들 수 있지만 한 단계에서 할 수있는 일이 있다는 것을 알았습니까?
. 예컨대 코드이 변수를 할당 받고, 파이썬 예외 handeling
try:
a=b
c=d
e=f
except:
bla bla
인 예외는 것이 가능 "E = F"I 여전히 = B와 C를 원하는 = D
발생되면? 내가 여러 번 try 문을 만들 수 있지만 한 단계에서 할 수있는 일이 있다는 것을 알았습니까?
try:
a = "foo"
c = "bar"
e = unknown_function()
except:
pass
print a, C# prints "foo bar"
모두 a
및 c
은 예외가 처리 후 단순히 값을 사용할 수 있습니다, 설정됩니다. e
은 해당 행이 실행될 때 예외가 발생하기 때문에 아무 것도 설정되지 않습니다.
예, 그것은 완벽하게 가능하다. 아래 데모는 다음과 같습니다
>>> try:
... a = 1
... b = 2
... c = 1/0 # This will raise a ZeroDivisionError
... except ZeroDivisionError:
... print 'an error occurred'
...
an error occurred
>>> a # a still exists
1
>>> b # so does b
2
>>> c # only c is undefined
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>>
try/except
는 예외가 발생 될 때까지 일반적으로 시도 블록의 코드를 실행하도록 설계되었습니다. 그렇게되면 try 블록이 즉시 종료됩니다. 즉, 코드 뒤에만 예외가 발생한 행은 무시됩니다.
그러나 예외가 제기 된 곳을 알 수 없기 때문에 이것은 실용적인 가치가 없습니다. 3 개의 표현식 모두에서 예외를 잡으려고하고 있는데, 어디에서 발생했는지 알고 싶다면 try ... except 블록을 사용해야합니다. –
내가 제대로 이해하면이 기본적으로 발생합니다. 예외를 발생 시키더라도 try 블록 내부에서 이미 발생한 모든 것을 취소하지 않습니다. 오류가 e
, a
및 c
의 할당에 발생하는 경우의 예에서, 여전히 그들이 할당 된 값을 가질 것이다.
try:
a = b
c = d
e = f # oh noes! error! Try block skips to the end!
except: pass
print (a) #but a and c are still there
print (c)
이것은 번거 로움없이 간단합니다. 어떤 유형의 오류가 발생할 수 있는지 예측할 수 없거나 여러 오류가 발생할 수있는 경우 가장 좋은 방법입니다.
try :
a=10
except :
print "bla A"
try :
b=20
except:
print "bla B"
try:
c=d
except :
print "bla C"
가장 좋은 방법은 try
블록 내부의 표현식 수를 제한하는 것입니다.
경우 예외가 발생 위치를 알 필요가, 당신은 아마 떨어져 사용하여 더 나은 여러 try...except
의 예외가 발생한 위치를 알 수있는 (실제) 방법이 없기 때문에 당신이 당신의 queestion에서 언급 한 것처럼.
표현이 동일한 유형의 경우, 비록 목록에 넣어 할 수 있으며, 같은 그들에 루프 :
vars = [a, b, c]
values = [1, 2, 0]
for i, (var, value) in enumerate(zip(vars, values)):
try:
var /= value
except ZeroDivisionError:
print 'The exception was raised on the {}. iteration'.format(i)
continue
은 당신이 원하는이 같은가요?
import sys
code = """
b = 100
d = 200
a=b
c=d
e=10/0
g=e
h = 100
"""
for line in filter(None,code.splitlines()):
print line
try:
exec line
except:
sys.excepthook(sys.exc_info()[0],sys.exc_info()[1],None)
결과
b = 100
d = 200
a=b
c=d
e=10/0
ZeroDivisionError: integer division or modulo by zero
g=e
NameError: name 'e' is not defined
h = 100
예외가 경우에만 코드 휴식을 발생합니다. 코드 앞이나 뒤에 정보를 얻을 수 없습니다. – aIKid
안녕하세요. 당신은 무엇을 의미합니까? "나는 아직도 a = b와 c = d"_ ?? 더 설명하십시오 – eyquem
A와 C가 코드를 실행 한 경우 ... – mhlester