모든 예외를 잡는 try
/ except
블록을 어떻게 작성할 수 있습니까?
sys.stderr
기록 될 수 있는 곳 이외의 다른 접근 방법이 적절한 곳을 생각하기는 어렵습니다 . 그것은 완벽하게 유효하고 일반적인 예외입니다.
try: whatever() except Exception as e: exp_capture()
했습니까?
모든 예외를 잡는 try
/ except
블록을 어떻게 작성할 수 있습니까?
sys.stderr
기록 될 수 있는 곳 이외의 다른 접근 방법이 적절한 곳을 생각하기는 어렵습니다 . 그것은 완벽하게 유효하고 일반적인 예외입니다.
try: whatever() except Exception as e: exp_capture()
했습니까?
답변:
당신은 할 수 있지만 아마해서는 안됩니다 :
try:
do_something()
except:
print "Caught it!"
그러나 이것은 또한 예외를 잡을 것이고 KeyboardInterrupt
일반적으로 원하지 않는 것입니까? 예외를 즉시 다시 발생 시키지 않으면 문서에서 다음 예제 를 참조하십시오 .
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
except Exception:
BaseException도 포착한다는 점을 제외하고는 명시 적으로 드러내야합니다.
베어 except:
조항 (다른 사람들이 사용해서는 안된다고 말한 것) 외에도 다음을 간단히 잡을 수 있습니다 Exception
.
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
예를 들어 종료하기 전에 포착되지 않은 예외를 처리하려는 경우 일반적으로 코드의 가장 바깥 레벨에서이 작업을 수행하는 것이 좋습니다.
의 장점 except Exception
베어 이상은 except
그것이 가장 분명 잡을 실 거예요 것을 몇 가지 예외가 있다는 것입니다 KeyboardInterrupt
그리고 SystemExit
당신이 잡은 그 다음 당신은 당신의 스크립트를 종료하는 사람을 위해 열심히 그것을 만들 수 삼키면 :.
Exception
것이다. int
예외로 as를 발생 시키는 것은 불가능하며 , 그렇게하려고 시도하면 TypeError
예외 가 발생하며, except Exception
그러한 경우 에는 동봉 절에 의해 포착됩니다 . 반면에, 이전 스타일 클래스를 제기 할 수 없습니다 서브 클래스 않는 "비 예외"자격이 Exception
-이는 것이다 베어에 의해 잡힐 except
절하지만 하지 에 의해 except Exception
절.
TypeError
sys.exit()
일반적으로 앱이 종료 될 것으로 예상하지만 SystemExit를 잡으면 종료되지 않음을 의미합니다. 마찬가지로 실행중인 스크립트 (Ctrl-break)에서 control-C를 누르면 오류가 발생하지 않고 계속 진행되지 않고 프로그램이 중지됩니다. 그러나 기존에 정리하기를 원한다면 둘 중 하나를 잡을 수 있습니다.
일반적인 예외를 처리하기 위해이 작업을 수행 할 수 있습니다
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
가능한 모든 예외를 잡으려면 catch BaseException
. 예외 계층 구조의 맨 위에 있습니다.
파이썬 3 : https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
파이썬 2.7 : https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
그러나 다른 사람들이 언급했듯이 일반적으로 특정 경우에만 필요하지 않습니다.
여기에있는 것과 비슷한 매우 간단한 예 :
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
모든 예외를 잡으려고 시도하는 경우 'print "예외를 던질 수있는 조치 수행'대신"try : "문에 모든 코드를 넣으십시오.
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
위의 예에서 다음 순서로 출력이 표시됩니다.
1) 예외가 발생할 수있는 조치 수행
2) 마지막으로 예외가 발생했는지 여부에 따라 try 문을 실행 한 직후에 호출됩니다.
3) "예외가 발생했습니다!" 또는 "모두 좋아 보인다!" 예외 발생 여부에 따라
도움이 되었기를 바랍니다!
특히 Python 3.0 이상에서 여러 가지 방법이 있습니다.
접근법 1
이것은 간단한 접근 방법이지만 실제로 어떤 코드 줄이 실제로 예외를 throw하는지 알 수 없으므로 권장되지 않습니다.
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
접근법 2
이 방법은 각 예외에 대한 자세한 정보를 제공하므로 권장됩니다. 다음을 포함합니다 :
유일한 단점은 tracback을 가져와야한다는 것입니다.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
try:
whatever()
except:
# this will catch any exception or error
이것이 적절한 파이썬 코딩이 아니라는 것을 언급 할 가치가 있습니다. 이것은 당신이 잡으려고하지 않을 많은 오류를 잡을 것입니다.