Python 이상 처리 와 반사 관련 문제 총화

이상 처리
프로그램 개발 에서 일부 의 오류 가 발생 하거나 판단 하기 귀 찮 을 때 이상 처리 로 할 수 있다.

import requests
 
while True:
    url = input("          :")
    res = requests.get(url=url)
    with open('content.txt', mode='wb') as f:
        f.write(res.content)
위 에서 다운로드 한 동 영상 코드 는 정상 적 인 상황 에서 실 행 될 수 있 지만 네트워크 에 문제 가 생기 면 프로그램 이 잘못 되 어 정상적으로 실 행 될 수 없습니다.

try:
    res = requests.get(url=url)
except Exception as e:
       ,          。
print("  ")

import requests
 
while True:
    url = input("          :")
    
    try:
        res = requests.get(url=url)
    except Exception as e:
        print("    ,  :{}".format(str(e)))
        continue
        
    with open('content.txt', mode='wb') as f:
        f.write(res.content)

num1 = input("     :")
num2 = input("     :")
try:
    num1 = int(num1)
    num2 = int(num2)
    result = num1 + num2
    print(result)
except Exception as e:
    print("    ")
앞으로 흔히 볼 수 있 는 응용 장면:
  • 위 챗 의 API 를 호출 하여 위 챗 메시지 의 푸 시,위 챗 결제 등 실현
  • 알 리 페 이,동 영상 재생 등
  • 데이터베이스 나 redis 연결 및 조작
  • 제3자 의 영상 재생 과 전송 기능 을 호출 하여 제3자 의 프로그램 에 문제 가 생 겨 서 발생 한 오류
  • 예외 처리 기본 형식:
    
    try:
        #     
    except Exception as e:
        # try         ,            。
    
    try:
        #     
    except Exception as e:
        # try         ,            。
    finally:
        # try          ,finally        ,        。
     
    print("end")
     
    """
    try:
        file_object = open("xxx.log")
        # ....
    except Exception as e:
        #     
    finally:
        file_object.close()  # try    ,    finally    ;try   ,  except    ,     finally    。
    """
    
    1.1 이상 세분 화
    
    import requests
     
    while True:
        url = input("          :")
        
        try:
            res = requests.get(url=url)
        except Exception as e:
            print("    ,  :{}".format(str(e)))
            continue
            
        with open('content.txt', mode='wb') as f:
            f.write(res.content)
    
    이전 에는 간단하게 이상 을 잡 았 을 뿐 이상 이 생기 면 알림 정 보 를 통일 하면 된다.이상 에 대해 더욱 세밀 한 이상 처 리 를 하려 면 이렇게 할 수 있다.
    
    import requests
    from requests import exceptions
     
    while True:
        url = input("          :")
        try:
            res = requests.get(url=url)
            print(res)    
        except exceptions.MissingSchema as e:
            print("URL     ")
        except exceptions.InvalidSchema as e:
            print("URL    ")
        except exceptions.InvalidURL as e:
            print("URL      ")
        except exceptions.ConnectionError as e:
            print("      ")
        except Exception as e:
            print("      ", e)
            
    #   :          ,      Exception        
    
    오 류 를 세분 화 하려 면,예 를 들 어 키 오류 발생 과 Value 오류 발생 을 분리 합 니 다.
    
    try:
        #     
        pass
     
    except KeyError as e:
        #   ,   try             ,  :    info_dict["n1"]       ,    。
        print("KeyError")
     
    except ValueError as e:
        #   ,   try           ,  :        int("   ")
        print("ValueError")
     
    except Exception as e:
        #   ,    except       (         )。
        print("Exception")
    
    Python 에는 선택 할 수 있 도록 세분 화 된 오류 가 많이 내장 되 어 있 습 니 다.
    일반적인 이상:
    """
    AttributeError 는 대상 이 없 는 트 리 에 접근 하려 고 합 니 다.예 를 들 어 foo.x,그러나 foo 에는 속성 x 가 없습니다.
    IOError 입 출력 이상;기본적으로 파일 을 열 수 없습니다.
    ImportError 에서 모듈 이나 가방 을 가 져 올 수 없습니다.기본적으로 경로 문제 나 이름 오류 입 니 다.
    IndentationError 문법 오류(하위 클래스);코드 가 제대로 정렬 되 지 않 았 습 니 다.
    IndexError 아래 표 시 된 색인 은 시퀀스 경 계 를 초과 합 니 다.예 를 들 어 x 는 세 개의 요소 만 있 을 때 n x[5]에 접근 하려 고 합 니 다.
    KeyError 사전 에 존재 하지 않 는 키 inf['xx']에 접근 하려 고 합 니 다.
    Keyboard Interrupt Ctrl+C 누 름
    NameError 는 아직 부여 되 지 않 은 변 수 를 사용 합 니 다.
    SyntaxError Python 코드 가 불법 이 고 코드 를 컴 파일 할 수 없습니다.(개인 적 으로 문법 오류 라 고 생각 하고 잘못 썼 습 니 다)
    TypeError 전송 대상 형식 과 요구 사항 이 일치 하지 않 습 니 다.
    Unbound LocalError 는 설정 되 지 않 은 부분 변 수 를 방문 하려 고 합 니 다.기본적으로 같은 이름 의 전역 변수 가 있 기 때 문 입 니 다.
    방문 하고 있다 고 생각 하 게 만 들 었 어 요.
    ValueError 는 값 의 유형 이 정확 하 더 라 도 호출 자가 원 하지 않 는 값 을 입력 합 니 다.
    """
    더 많은 이상:
    """
    ArithmeticError
    AssertionError
    AttributeError
    BaseException
    BufferError
    BytesWarning
    DeprecationWarning
    EnvironmentError
    EOFError
    Exception
    FloatingPointError
    FutureWarning
    GeneratorExit
    ImportError
    ImportWarning
    IndentationError
    IndexError
    IOError
    KeyboardInterrupt
    KeyError
    LookupError
    MemoryError
    NameError
    NotImplementedError
    OSError
    OverflowError
    PendingDeprecationWarning
    ReferenceError
    RuntimeError
    RuntimeWarning
    StandardError
    StopIteration
    SyntaxError
    SyntaxWarning
    SystemError
    SystemExit
    TabError
    TypeError
    UnboundLocalError
    UnicodeDecodeError
    UnicodeEncodeError
    UnicodeError
    UnicodeTranslateError
    UnicodeWarning
    UserWarning
    ValueError
    Warning
    ZeroDivisionError
    """
    1.2 사용자 정의 이상&이상 던 지기
    위 는 모두 Python 에 내 장 된 이상 이 고 특정한 오류 가 발생 한 후에 야 해당 하 는 이상 을 던 집 니 다.
    개발 에서 도 이상 을 사용자 정의 할 수 있다.
    
    class MyException(Exception):
        pass
    
    try:
        pass
    except MyException as e:
        print("MyException      ", e)
    except Exception as e:
        print("Exception", e)
    이 코드 는 exception 에서 MyException 이상 을 캡 처 하 는 것 을 정의 하지만,그 는 영원히 트리거 되 지 않 습 니 다.기본 적 인 이상 은 특정한 트리거 조건 이 있 기 때 문 입 니 다.예 를 들 어 색인 이 존재 하지 않 고 키 가 존재 하지 않 으 면 IndexError 와 KeyError 이상 을 촉발 할 수 있 습 니 다.
    사용자 정의 이상 에 대해 서 는 트리거 하려 면:raise MyException()클래스 를 사용 해 야 합 니 다.
    
    class MyException(Exception):
        pass
     
     
    try:
        # 。。。
        raise MyException()
        # 。。。
    except MyException as e:
        print("MyException      ", e)
    except Exception as e:
        print("Exception", e)
    
    
    class MyException(Exception):
        def __init__(self, msg, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.msg = msg
     
     
    try:
        raise MyException("xxx   ")
    except MyException as e:
        print("MyException      ", e.msg)
    except Exception as e:
        print("Exception", e)
    
    
    class MyException(Exception):
        title = "    "
     
     
    try:
        raise MyException()
    except MyException as e:
        print("MyException      ", e.title)
    except Exception as e:
        print("Exception", e)
    
    사례 1:너 와 나 는 합작 하여 공동 개발 하고 너 는 내 가 쓴 방법 을 사용한다.
    나 는 함 수 를 정의 했다.
    
    class EmailValidError(Exception):
        title = "      "
     
    class ContentRequiredError(Exception):
        title = "        "
        
    def send_email(email,content):
        if not re.match("\[email protected]",email):
            raise EmailValidError()
    	if len(content) == 0 :
            raise ContentRequiredError()
    	#       ...
        # ...
    
    너 는 내 가 쓴 함 수 를 호출 했다.
    
    def execute():
        #     
        # ...
        
    	try:
            send_email(...)
        except EmailValidError as e:
            pass
        except ContentRequiredError as e:
            pass
        except Exception as e:
            print("    ")
     
    execute()
     
    #   :          ,      Exception        。
    
    사례 2:프레임 내부 에서 이미 정 의 를 내 렸 기 때문에 어떤 오 류 를 만 나 더 라 도 서로 다른 이상 을 일 으 킬 수 있다.
    
    import requests
    from requests import exceptions
     
    while True:
        url = input("          :")
        try:
            res = requests.get(url=url)
            print(res)    
        except exceptions.MissingSchema as e:
            print("URL     ")
        except exceptions.InvalidSchema as e:
            print("URL    ")
        except exceptions.InvalidURL as e:
            print("URL      ")
        except exceptions.ConnectionError as e:
            print("      ")
        except Exception as e:
            print("      ", e)
            
    #   :          ,      Exception        。
    
    사례 3:규정 에 따라 지 정 된 이상 을 촉발 하고 모든 이상 은 특수 한 의 미 를 가진다.

    1.4 특별한 finally
    
    try:
        #     
    except Exception as e:
        # try         ,            。
    finally:
        # try          ,finally        ,        。
     
    print("end")
    함수 나 방법 에서 이상 처리 코드 를 정의 할 때 finally 와 return 에 특히 주의해 야 합 니 다.
    
    def func():
        try:
            return 123
        except Exception as e:
            pass
        finally:
            print(666)
            
    func()
    try 나 except 에서 return 을 정의 하 더 라 도 마지막 finally 블록 에 있 는 코드 를 실행 합 니 다.
    반사
    반 사 는 대상 에서 구성원 을 조작 할 수 있 도록 더욱 유연 한 방식 을 제공 합 니 다(문자열 로 에서 구성원 을 조작 할 수 있 습 니 다).
    
    class Person(object):
        
        def __init__(self,name,wx):
            self.name = name
            self.wx = wx
    	
        def show(self):
            message = "  {},  :{}".format(self.name,self.wx)
            
            
    user_object = Person("    ","hqss666")
     
     
    #   .           
    user_object.name
    user_object.wx
    user_object.show()
     
    #   .           
    user_object.name = "    "
    
    
    user = Person("    ","hqss666")
     
    # getattr     
    getattr(user,"name") # user.name
    getattr(user,"wx")   # user.wx
     
     
    method = getattr(user,"show") # user.show
    method()
    #  
    getattr(user,"show")()
     
    # setattr     
    setattr(user, "name", "    ") # user.name = "    "
    
    Python 에서 4 개의 내장 함 수 를 제공 하여 반 사 를 지원 합 니 다:
    getattr,대상 에서 구성원 가 져 오기
    
    v1 = getattr(  ,"    ")
    v2 = getattr(  ,"    ",         )
    setattr,대상 에 구성원 설정
    
    setattr(  ,"    ", )
    hasattr,대상 에 구성원 이 포함 되 어 있 는 지 여부
    
    v1 = hasattr(  ,"    ") # True/False
    delattr,대상 의 구성원 삭제
    
    delattr(  ,"    ")
    나중에 대상 을 다시 만나면 멤버 들 의 이런 작성 방식 은 반사 에 의 해 이 루어 질 수 있 습 니 다.
    
    class Account(object):
     
        def login(self):
            pass
     
        def register(self):
            pass
     
        def index(self):
            pass
     
        
    def run(self):
        name = input("           :") # index register login xx run ..
        
        account_object = Account()
        method = getattr(account_object, name,None) # index = getattr(account_object,"index")
        
        if not method:
            print("    ")
            return 
        method()
    
    2.1 일부 대상
    Python 에 서 는 다음 과 같은 말 이 있 습 니 다. 모든 대상 의 내부 에는 자신 이 지 키 는 구성원 이 있다.
    대상
    
    class Person(object):
        
        def __init__(self,name,wx):
            self.name = name
            self.wx = wx
    	
        def show(self):
            message = "  {},  :{}".format(self.name,self.wx)
            
            
    user_object = Person("    ","hqss666")
    user_object.name
    
    대상
    
    class Person(object):
        title = "   "
     
    Person.title
    # Person       (       )
    모듈 은 대상
    
    import re
     
    re.match
    # re        (       )。
    반사 지원 은 문자열 형식 으로 대상 에서 구성원 을 조작 하 는 것 을 지원 하기 때문에 반사 기반 으로 클래스,모듈 의 구성원 을 조작 할 수 있 습 니 다.
    간단 하고 거칠다:xx.oo 만 보면 반사 로 이 루어 질 수 있다.
    
    class Person(object):
        title = "    "
     
    v1 = Person.title
    print(v1)
    v2 = getattr(Person,"title")
    print(v2)
    
    import re
     
    v1 = re.match("\w+","dfjksdufjksd")
    print(v1)
     
    func = getattr(re,"match")
    v2 = func("\w+","dfjksdufjksd")
    print(v2)
    2.2 import_모듈+반사
    
    #     
    from importlib import import_module
     
    m = import_module("random")
     
    v1 = m.randint(1,100)
    Python 에서 모듈 을 가 져 오 려 면 import 문법 으로 가 져 올 수 있 습 니 다.기업 도 문자열 형식 으로 가 져 올 수 있다.
    예시 1:
    
    #     
    import random
     
    v1 = random.randint(1,100)
    예시 2:
    
    #     exceptions
    from requests import exceptions as m
    
    #     exceptions
    from importlib import import_module
    m = import_module("requests.exceptions")
    예시 3:
    
    #     exceptions,  exceptions  InvalidURL 。
    from requests.exceptions import InvalidURL
    
    #     
    from importlib import import_module
    m = import_module("requests.exceptions.InvalidURL") #   ,import_module         
    
    #     
    from importlib import import_module
    m = import_module("requests.exceptions")
    #        
    cls = m.InvalidURL
    많은 프로젝트 의 소스 코드 에서import_modulegetattr가 문자열 의 형식 에 따라 모듈 을 가 져 오고 구성원 을 가 져 옵 니 다.예 를 들 어:
    
    from importlib import import_module
     
    path = "openpyxl.utils.exceptions.InvalidFileException"
     
    module_path,class_name = path.rsplit(".",maxsplit=1) # "openpyxl.utils.exceptions"   "InvalidFileException"
     
    module_object = import_module(module_path)
     
    cls = getattr(module_object,class_name)
     
    print(cls)
    
    우 리 는 개발 에서 도 이 를 바탕 으로 개발 하여 코드 의 확장 성 을 높 일 수 있다.
    이로써 Python 진급 에서 대상 을 대상 으로 하 는 이상 처리 와 반사 총 결 이 완료 되 었 습 니 다.부적 절 한 점 이 있 으 면 지적 을 환영 합 니 다!
    파 이 썬 의 이상 처리 와 반사 에 관 한 문 제 를 정리 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 의 이상 처리 와 반사 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기