Python 예외에 대한 모범 사례?
예외를 만드는 모범 사례는 무엇입니까? 방금 이걸 봤는데 겁에 질려 야하는지, 좋아해야하는지 모르겠어요. 문자열 자체가 예외를 던질 수 있기 때문에 예외가 절대 문자열을 보유해서는 안된다는 책을 여러 번 읽었습니다. 이것에 대한 진실이 있습니까?
기본적으로 스크립트에서 이해 한 바에 따르면 모든 내부 Python 라이브러리가 공통 오류 메시지 형식 (절망적으로 필요한 것)을 가지므로 오류 메시지 문자열을 넣는 것이 왜 좋은 생각인지 이해할 수 있습니다. (거의 모든 메소드는 유효하지 않은 것이 전혀 필요하지 않기 때문에 예외를 던집니다.)
문제의 코드는 다음과 같습니다.
"""
Base Exception, Error
"""
class Error(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return "[ERROR] %s\n" % str(self.message)
def log(self):
ret = "%s" % str(self.message)
if(hasattr(self, "reason")):
return "".join([ret, "\n==> %s" % str(self.reason)])
return ret
class PCSException(Error):
def __init__(self, message, reason = None):
self.message = message
self.reason = reason
def __str__(self):
ret = "[PCS_ERROR] %s\n" % str(self.message)
if(self.reason != None):
ret += "[REASON] %s\n" % str(self.reason)
return ret
이것은 빙산의 일각에 불과하지만 누군가이 이것을 끔찍한 아이디어로 만드는 것에 대한 통찰력을 줄 수 있습니까? 또는 훨씬 더 나은 예외 코딩 프로세스 / 스타일이있는 경우.
문자열 자체가 예외를 던질 수 있기 때문에 예외가 절대 문자열을 보유해서는 안된다는 책을 여러 번 읽었습니다. 이것에 대한 진실이 있습니까?
뭐?
이에 대한 참조 또는 링크를 제공하십시오. 그것은 완전히 사실이 아닙니다.
모든 개체가 예외를 throw 할 수 있으므로 해당 논리에 의해 예외에 개체가 포함될 수 없습니다.
아니요, "문자열 없음"은 Python 컨텍스트에서 단순히 미친 짓입니다. 아마도 C ++ 컨텍스트에서 읽을 수 있습니다.
편집하다
옛날 옛적에 (옛날로) 실제 클래스 대신 이름으로 파이썬 예외를 일으킬 수 있습니다.
raise "SomeNameOfAnExceptionClass"
이것은 나쁘다. 그러나 이것은 예외 안에 문자열을 포함 하지 않습니다 . 이것은 실제 클래스 객체 대신 문자열로 예외를 명명하는 것입니다. 2.5에서는 여전히 작동 할 수 있지만 지원 중단 경고가 표시됩니다.
아마도 이것은 "문자열 이름으로 예외를 발생시키지 마십시오"라고 읽은 것입니다.
강력한 예외 처리 (Python에서) -얼마 전에 작성한 "Python 예외에 대한 모범 사례"블로그 게시물입니다. 유용 할 수 있습니다.
블로그의 몇 가지 핵심 사항 :
흐름 제어에 예외를 사용하지 마십시오.
예외 상황에는 예외가 있습니다. 정상 실행의 일부가 아닌 이벤트입니다.
패턴을 찾을 수없는 경우 -1을 반환하는 문자열에서 'find'를 고려하지만 문자열 끝을 넘어서 인덱싱하면 예외가 발생합니다. 문자열을 찾지 못하는 것은 정상적인 실행입니다.
처리 방법을 알고있는 수준에서 예외 처리
...
가장 좋은 곳은 예외를 처리 할 수있는 코드 조각입니다. 프로그래밍 오류 (예 : IndexError, TypeError, NameError 등)와 같은 일부 예외의 경우 "처리"하면 실제 버그를 숨길 수 있기 때문에 예외는 프로그래머 / 사용자에게 맡기는 것이 가장 좋습니다.
항상 "이 예외를 처리하기에 적합한 장소입니까?"라고 질문하십시오. 그리고 모든 예외를 잡을 때주의하십시오.
코드에서 발생한 예외 문서화
...
코드에서 던질 수있는 예외를 생각하면 더 좋고 안전하며 캡슐화 된 코드를 작성하는 데 도움이됩니다.
I believe the advice against creating exceptions with a string comes from "Learning Python" (O'Reilly). In a section entitled String Exceptions Are Right Out!, it points out the (now removed) ability to create an exception directly with an arbitrary string.
The code it gives as an example is:
myexc = "My exception string"
try:
raise myexc
except myexc:
print ('caught')
This is on p858 of the Fourth Edition (paperback).
First impression is that it's entirely too much code for an exception.
Formatting exceptions should be done in logger configuration. Same goes for the logging itself.
It also redefines the standard (and deprecated) message attribute, and doesn't call the superclass constructor. (This might or might not break Python 3.0 exception chaining, I haven't tried because I'm running 2.6)
Most of what the extra code does can be realised using BaseException.args, by logging the following as the "message":
'\n==> '.join(exception.args)
I'd argue that if something can be done using a common / idiomatic mechanism, it should especially be done so in exception handling. (Exceptions being a mechanism to signal something across application layers.)
Personally, I try to avoid anything beyond
class SomeException(Exception): pass
(Disclaimer: answer subjective, possibly by nature of the question.)
class Error(Exception):
"""Base class for other exceptions"""
pass
class empty_string_error(Error):
"""Raised when the input value is too large"""
pass
while(1):
try:
if("Your Condition"):
raise empty_string_error
else:
print("OUTPUT")
except empty_string_error:
print("APT MESSAGE")
print(" ")
finally:
pint("Mandatory code")
참고URL : https://stackoverflow.com/questions/839636/best-practices-for-python-exceptions
'programing tip' 카테고리의 다른 글
Java에서 main ()이 무효 인 이유는 무엇입니까? (0) | 2020.12.04 |
---|---|
javascript에서 URL 체계가 지원되는지 확인 (0) | 2020.12.04 |
이벤트 핸들러와 콜백의 차이점 (0) | 2020.12.04 |
jaxb 비 정렬 화 타임 스탬프 (0) | 2020.12.04 |
Oracle Database Express를위한 무료 GUI 관리 도구가 있습니까? (0) | 2020.12.04 |