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(" ")
앞으로 흔히 볼 수 있 는 응용 장면:
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_module
와getattr
가 문자열 의 형식 에 따라 모듈 을 가 져 오고 구성원 을 가 져 옵 니 다.예 를 들 어:
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 진급 에서 대상 을 대상 으로 하 는 이상 처리 와 반사 총 결 이 완료 되 었 습 니 다.부적 절 한 점 이 있 으 면 지적 을 환영 합 니 다!
파 이 썬 의 이상 처리 와 반사 에 관 한 문 제 를 정리 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 의 이상 처리 와 반사 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.