programing

발생한 예외 유형을 판별하려면 어떻게 해야 합니까?

sourcejob 2022. 10. 4. 23:27
반응형

발생한 예외 유형을 판별하려면 어떻게 해야 합니까?

some_function()은 "예외"로합니다.except:

try:
    some_function()
except:
    print("exception happened!")

예외가 발생한 원인을 확인하려면 어떻게 해야 합니까?

다른 답변들은 모두 일반적인 예외를 잡아서는 안 된다고 지적하고 있지만, 아무도 그 이유를 말하고 싶어하지 않는 것 같습니다.이것은, 「규칙」을 어길 수 있는 시점을 이해하는 데 불가결합니다.여기 설명이 있습니다.기본적으로 숨기지 않기 위해서입니다.

따라서 이러한 작업을 수행하지 않는 한 일반적인 예외를 포착해도 상관 없습니다.예를 들어 다음과 같은 방법으로 예외에 대한 정보를 사용자에게 제공할 수 있습니다.

  • GUI에서 예외를 대화상자로 표시
  • 멀티스레딩 또는 다중처리 응용 프로그램에서 작업자 스레드 또는 프로세스에서 제어 스레드 또는 프로세스로 예외 전송

그렇다면 일반적인 예외를 포착하는 방법은 무엇일까요?몇 가지 방법이 있다.예외 객체만 필요한 경우 다음과 같이 수행합니다.

try:
    someFunction()
except Exception as ex:
    template = "An exception of type {0} occurred. Arguments:\n{1!r}"
    message = template.format(type(ex).__name__, ex.args)
    print message

확인하다 message놓치기 쉬운 방법으로 사용자에게 전달!다른 많은 메시지에 메시지가 묻혀 있는 경우 위와 같이 인쇄하는 것만으로는 충분하지 않을 수 있습니다.사용자의 주의를 끌지 못하는 것은 모든 예외를 삼키는 것이나 마찬가지이며, 이 페이지의 답변을 읽고 나서 당신이 느꼈어야 할 한 가지 인상은 좋지 않다는 것입니다.예외 블록을 a로 끝냅니다.raise스테이트먼트는 검출된 예외를 투과적으로 다시 발생시킴으로써 문제를 해결합니다.

및 의 except: 두로 나눌 수 .

  • except:
  • " " "SystemExit,KeyboardInterrupt ★★★★★★★★★★★★★★★★★」GeneratorExit위의 코드에는 잡히지 않습니다.일반적으로 이것은 당신이 원하는 것입니다.예외 계층을 참조하십시오.

예외를 검출하지 않았을 때와 같은 스택트레이스를 취득하는 경우도, 다음과 같이 취득할 수 있습니다(except 구내).

import traceback
print traceback.format_exc()

모듈을 사용하는 경우 다음과 같이 예외를 로그(메시지 포함)에 인쇄할 수 있습니다.

import logging
log = logging.getLogger()
log.exception("Message for you, sir!")

스택을 자세히 조사하려면 변수 등을 조사합니다.pdb" " " 외외록: 。

import pdb
pdb.post_mortem()

나는 이 마지막 방법이 벌레를 사냥할 때 매우 유용하다는 것을 알았다.

예외 개체가 속한 클래스의 이름을 가져옵니다.

e.__class__.__name__

print_exc() 함수를 사용하면 오류 메시지에 필수적인 스택트레이스도 출력됩니다

다음과 같이 합니다.

from traceback import print_exc

class CustomException(Exception): pass

try:
    raise CustomException("hi")
except Exception as e:
    print ('type is:', e.__class__.__name__)
    print_exc()
    # print("exception happened!")

다음과 같은 출력이 표시됩니다.

type is: CustomException
Traceback (most recent call last):
  File "exc.py", line 7, in <module>
    raise CustomException("hi")
CustomException: hi

인쇄 및 후 그냥 할 수 .raise:

from traceback import print_exc

class CustomException(Exception): pass

def calculate():
    raise CustomException("hi")

try:
    calculate()
except CustomException as e:
    # here do some extra steps in case of CustomException
    print('custom logic doing cleanup and more')
    # then re raise same exception
    raise

출력:

custom logic doing cleanup and more

인터프리터는 예외를 출력합니다.

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    calculate()
  File "test.py", line 6, in calculate
    raise CustomException("hi")
__main__.CustomException: hi

★★★ raise원래의 예외는 계속해서 콜스택 상부에 전파됩니다.(잠재 가능한 함정에 주의) 새로운 예외를 발생시키면 새로운 (짧은) 스택트레이스가 생성됩니다.

from traceback import print_exc

class CustomException(Exception):
    def __init__(self, ok):
        self.ok = ok

def calculate():
    raise CustomException(False)

try:
    calculate()
except CustomException as e:
    if not e.ok:
        # Always use `raise` to rethrow exception
        # following is usually mistake, but here we want to stress this point
        raise CustomException(e.ok)
    print("handling exception")

출력:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    raise CustomException(e.message)
__main__.CustomException: hi    

에 traceback이 않은 해 주세요.calculate()으로부터의 9입니다.e.

다 못 요, 다 잡으면 안 돼요.try: ... except너무 넓어서요.어떤 이유로든 일어날 것으로 예상되는 것들을 잡아라.를 들어을 할 때 에 대해 더 알고 에는 디버깅을 해야 .

try:
    ...
except Exception as ex:
    print ex # do whatever you want for debugging.
    raise    # re-raise exception.

most most most 음 、 음 、 음 、 most 、 most 、 most most 、 most most most 。except (…) as (…): 않는다.에 있다.sys.exc_info()기능.sys module(강조 마이닝) 매뉴얼에서 다음 내용을 참조하십시오.

이 함수는 현재 처리 중인 예외에 대한 정보를 제공하는 3가지 값의 태플을 반환합니다.
(…)
스택의 어느 곳에서도 예외가 처리되지 않으면 3개의 None 값을 포함하는 태플이 반환됩니다.그 이외의 경우 반환되는 값은 (type, value, traceback)입니다., type은 처리 중인 예외 유형(BaseException의 서브 클래스), value는 예외 인스턴스(예외 유형의 인스턴스), traceback은 예외 발생 지점에서 콜스택을 캡슐화하는 트레이스백오브젝트(「참조 매뉴얼」을 참조)를 가져옵니다.

에는 ★★★★★★★★★★★★★★★★★★★★★.sys.exc_info()'어떤 유형의 예외가 발생했는지 어떻게 알 수 있는가?'라는 최초 질문에 대한 가장 직접적인 답변으로 취급할 수 있습니다.

~가 아니면somefunction코드화된 레거시 함수가 매우 나쁘기 때문에 필요한 것은 없습니다.

개의 " " " 를 합니다.except다음과 같이 합니다.

try:
    someFunction()
except ValueError:
    # do something
except ZeroDivision:
    # do something else

요점은 일반적인 예외는 잡지 말고 필요한 것만 잡아야 한다는 것입니다.예상치 못한 오류나 버그를 그림자처럼 만들고 싶지 않으실 겁니다.

Python 2 에서는, 다음의 것이 편리합니다.

except Exception, exc:

    # This is how you get the type
    excType = exc.__class__.__name__

    # Here we are printing out information about the Exception
    print 'exception type', excType
    print 'exception msg', str(exc)

    # It's easy to reraise an exception with more information added to it
    msg = 'there was a problem with someFunction'
    raise Exception(msg + 'because of %s: %s' % (excType, exc))

답변은 디버깅에서는 이 예외를 으로 테스트하려면 , 「」를 참조해 주세요.isinstance(e, SomeException) can can can 의 를 테스트하기 때문에합니다.SomeException예외 계층에 적용되는 기능을 만들 수도 있습니다.

이것이 조금 더 도움이 되기를 바란다.

import sys
varExcepHandling, varExcepHandlingZer = 2, 0
try:
  print(varExcepHandling/varExcepHandlingZer)
except Exception as ex: 
  print(sys.exc_info())

sys.exc_info() '이 반환됩니다sys.exc_info()[0]

, 「:-」라고 써 .dir(__builtin__)

type 및 " " " 。as의 표시

try:#code
except Exception as e:
     m=type(e)
     #m is the class of the exception
     strm=str(m)
     #strm is the string of m

제 예외는 이렇게 처리하겠습니다.그 아이디어는 그것이 쉬우면 문제를 해결하고, 가능하면 나중에 더 바람직한 해결책을 추가하는 것입니다.예외를 생성하는 코드에서 문제를 해결하지 마십시오. 그렇지 않으면 코드가 원래 알고리즘의 트랙을 잃게 됩니다. 이 알고리즘은 정확히 작성되어야 합니다.단, 문제를 해결하기 위해 필요한 데이터를 전달하고 생성한 코드 이외에서 문제를 해결할 수 없는 경우에 대비하여 람다를 반환하십시오.

path = 'app.p'

def load():
    if os.path.exists(path):
        try:
            with open(path, 'rb') as file:
                data = file.read()
                inst = pickle.load(data)
        except Exception as e:
            inst = solve(e, 'load app data', easy=lambda: App(), path=path)()
    else:
        inst = App()
    inst.loadWidgets()

# e.g. A solver could search for app data if desc='load app data'
def solve(e, during, easy, **kwargs):
    class_name = e.__class__.__name__
    print(class_name + ': ' + str(e))
    print('\t during: ' + during)
    return easy

현재로서는 앱의 목적에 대해 접선적으로 생각하고 싶지 않기 때문에 복잡한 솔루션은 추가하지 않았습니다.하지만 미래에 가능한 솔루션에 대해 더 많이 알게 되면 (앱이 더 많이 설계되었기 때문에) 다음에 색인화된 솔루션 사전을 추가할 수 있습니다.during

표시된 예에서는 'app.p' 파일이 실수로 삭제되었는지와 같이 다른 곳에 저장된 앱 데이터를 찾는 방법이 있습니다.

현재 예외 핸들러를 쓰는 것은 현명한 방법이 아니기 때문에(앱 디자인이 진화하기 때문에 가장 좋은 해결 방법을 아직 모릅니다), 처음 앱을 실행하는 것처럼 행동하는 간단한 수정만 반환합니다(이 경우).

Lauritz의 답변에 덧붙이기 위해 예외 처리를 위한 데코레이터/랩퍼를 만들고 래퍼에 어떤 유형의 예외가 발생했는지 기록했습니다.

class general_function_handler(object):
    def __init__(self, func):
        self.func = func
    def __get__(self, obj, type=None):
        return self.__class__(self.func.__get__(obj, type))
    def __call__(self, *args, **kwargs):
        try:
            retval = self.func(*args, **kwargs)
        except Exception, e :
            logging.warning('Exception in %s' % self.func)
            template = "An exception of type {0} occured. Arguments:\n{1!r}"
            message = template.format(type(e).__name__, e.args)
            logging.exception(message)
            sys.exit(1) # exit on all exceptions for now
        return retval

이것은 클래스 메서드 또는 데코레이터를 사용한 스탠드아론 함수에서 호출할 수 있습니다.

@general_function_module

자세한 예에 대해서는, 다음의 블로그를 참조해 주세요.http://ryaneirwin.wordpress.com/2014/05/31/python-decorators-and-exception-handling/

Lauritz가 권장하는 대로 시작할 수 있습니다.

except Exception as ex:

에 그냥 ★★★★★★★★★★★★★★★★★★★★★★★★print ex다음과 같이 합니다.

try:
    #your try code here
except Exception as ex:
    print ex

예외 유형과 예외 텍스트 모두에 대해 다음을 사용합니다.

import sys
print(str(sys.exc_info()[0]).split(' ')[1].strip('>').strip("'")+"-"+(str(sys.exc_info()[1])))

예외 유형만 원하는 경우:사용 -->

import sys
print(str(sys.exc_info()[0]).split(' ')[1].strip('>').strip("'"))

고마워 라제슈와르

실제 예외는 다음과 같은 방법으로 캡처할 수 있습니다.

try:
    i = 1/0
except Exception as e:
    print e

예외에 대한 자세한 내용은 Python Tutorial을 참조하십시오.

당신의 질문은 다음과 같습니다. "예외를 발생시킨 some Function()에서 정확히 무슨 일이 일어났는지 어떻게 확인할 수 있습니까?"

생산 코드의 예상치 못한 예외(많은 답변이 상정)에 대처하는 방법이 아니라 개발 중에 특정 예외의 원인이 무엇인지 알아내는 방법에 대해 묻고 있는 것 같습니다.

가장 쉬운 방법은 캡처되지 않은 예외가 발생한 곳을 중지하고 가급적 종료하지 않는 디버거를 사용하여 변수를 검사하는 것입니다.이클립스, 이클립스 IDE PyDev.이클립스에서하려면 [디버깅(Debug )]를 열고 [이클립스(Eclipse)]를 선택합니다.Manage Python Exception Breakpoints Run및 체크박스를 켜겠습니다.Suspend on uncaught exceptions.

예외를 포착하는 것을 자제하면 Python이 출력하는 트레이스 백을 통해 어떤 예외가 발생했는지 알 수 있습니다.

언급URL : https://stackoverflow.com/questions/9823936/how-do-i-determine-what-type-of-exception-occurred

반응형