2014-01-21 2 views
0
나는 예외가 이루어지기 전에 내가 할당 된 변수를 얻을 수있는 방법을 찾고 싶은

. 예컨대 코드이 변수를 할당 받고, 파이썬 예외 handeling

try: 
    a=b 
    c=d 
    e=f 
except: 
    bla bla 

인 예외는 것이 가능 "E = F"I 여전히 = B와 C를 원하는 = D

발생되면? 내가 여러 번 try 문을 만들 수 있지만 한 단계에서 할 수있는 일이 있다는 것을 알았습니까?

+0

예외가 경우에만 코드 휴식을 발생합니다. 코드 앞이나 뒤에 정보를 얻을 수 없습니다. – aIKid

+0

안녕하세요. 당신은 무엇을 의미합니까? "나는 아직도 a = b와 c = d"_ ?? 더 설명하십시오 – eyquem

+0

A와 C가 코드를 실행 한 경우 ... – mhlester

답변

0
try: 
    a = "foo" 
    c = "bar" 
    e = unknown_function() 
except: 
    pass 

print a, C# prints "foo bar" 

모두 ac은 예외가 처리 후 단순히 값을 사용할 수 있습니다, 설정됩니다. e은 해당 행이 실행될 때 예외가 발생하기 때문에 아무 것도 설정되지 않습니다.

1

예, 그것은 완벽하게 가능하다. 아래 데모는 다음과 같습니다

>>> 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 블록이 즉시 종료됩니다. 즉, 코드 뒤에만 예외가 발생한 행은 무시됩니다.

+0

그러나 예외가 제기 된 곳을 알 수 없기 때문에 이것은 실용적인 가치가 없습니다. 3 개의 표현식 모두에서 예외를 잡으려고하고 있는데, 어디에서 발생했는지 알고 싶다면 try ... except 블록을 사용해야합니다. –

0

내가 제대로 이해하면이 기본적으로 발생합니다. 예외를 발생 시키더라도 try 블록 내부에서 이미 발생한 모든 것을 취소하지 않습니다. 오류가 e, ac의 할당에 발생하는 경우의 예에서, 여전히 그들이 할당 된 값을 가질 것이다.

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) 
0

이것은 번거 로움없이 간단합니다. 어떤 유형의 오류가 발생할 수 있는지 예측할 수 없거나 여러 오류가 발생할 수있는 경우 가장 좋은 방법입니다.

try : 
    a=10 
except : 
    print "bla A" 
try : 
    b=20 
except: 
    print "bla B" 
try: 
    c=d 
except : 
    print "bla C" 
0

가장 좋은 방법은 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 
0

은 당신이 원하는이 같은가요?

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