이 튜토리얼에서는 전체 시스템 관점에서 Python의 오류 조건을 처리하는 방법을 배웁니다. 오류 처리는 설계의 중요한 측면이며 최종 사용자까지 가장 낮은 수준 (때로는 하드웨어)에서 교차합니다. 일관된 전략이 없으면 시스템이 신뢰할 수없고, 사용자 경험이 좋지 않을 것이며, 디버깅 및 문제 해결에 많은 어려움이 생길 것입니다. 성공의 열쇠는 이러한 모든 인터 로킹 측면을 명시 적으로 고려하고 각 요점을 다루는 솔루션을 형성하는 솔루션을 형성하는 것입니다. 처리 모델 : 상태 코드 및 예외. 상태 코드는 모든 프로그래밍 언어로 사용할 수 있습니다. 예외는 언어/런타임 지원이 필요합니다.
Python은 예외를 지원합니다. Python과 표준 라이브러리는 예외를 사용하여 IO 오류와 같은 많은 예외적 인 상황을보고, 제로로 나누고, 바운드 지수로 나누고, 반복 끝과 같은 예외적 인 상황 (숨겨져 있지만). 대부분의 라이브러리는 소송을 따르고 예외를 제기합니다.
이는 코드가 Python과 라이브러리가 제기 한 예외를 처리해야한다는 것을 의미하므로 필요할 때 코드에서 예외를 제외하고 상태 코드에 의존하지 않을 수도 있습니다.빠른 예
다음은 try 절을 호출 할 때의 출력이 있습니다. 예외가 발생하지 않으면 프로그램은 조항을 제외하고 건너 뜁니다.
정수를 입력하면 프로그램이 예상대로 작동합니다. 그러나 플로트 나 문자열에 들어가면 프로그램이 실행 중지 중지됩니다.예외를 포착 할 때 세 가지 옵션이 있습니다.
조용히 삼키고 (처리하고 계속 달리기) 로깅과 같은 것을 다시 수행 할 수 있도록 동일한 예외를 제기하십시오. 원본.
를 처리하는 방법을 알고 완전히 복구 할 수있는 경우 예외를 삼켜야합니다. 예를 들어, 다른 형식 (JSON, YAML)으로 입력 파일을 받으면 다른 PARSERS를 사용하여 구문 분석을 시도 할 수 있습니다. JSON 파서가 파일이 유효한 JSON 파일이 아니라는 예외를 제기 한 경우, 그것을 삼키고 Yaml Parser와 함께 시도합니다. Yaml 파서가 실패한 경우 예외가 전파되게합니다.
def f():<br> return 4 / 0<br>def g():<br> raise Exception("Don't call us. We'll call you")<br>def h():<br> try:<br> f()<br> except Exception as e:<br> print(e)<br> <br> try:<br> g()<br> except Exception as e:<br> print(e)<br>
예외를 처리하려면 을 제외하고 <code>를 사용하십시오. 예를 들면 :
def f():<br> return 4 / 0<br>def g():<br> raise Exception("Don't call us. We'll call you")<br>def h():<br> try:<br> f()<br> except Exception as e:<br> print(e)<br> <br> try:<br> g()<br> except Exception as e:<br> print(e)<br>
라는 이름으로 바인딩합니다. as e
e
다시 동일한 예외를 다시 제외하여 예외를 다시 올리려면 핸들러 안에 논쟁없이
마지막으로 raise
invoke_function()
조항은 예외가 어딘가에 제기 되더라도 일부 정리 코드가 실행되도록하기를 원합니다. 예를 들어, 완료되면 닫으려는 데이터베이스 연결이있을 수 있습니다. 다음은 잘못된 방법이 있습니다 :
Please enter a number: 10.3<br>Oops! That was no valid number. Try again...<br>Please enter a number: hello<br>Oops! That was no valid number. Try again...<br>Please enter a number: 10.0<br>Oops! That was no valid number. Try again...<br>Please enter a number: <br>
>를 사용할 때는 원래 예외를 가리기 때문에 예외를 제외하지 않아야합니다.
컨텍스트 관리자는 정리 된시기에도 실행이 자동으로 정리 된 클리닝 코드에서 파일 또는 DB 커넥션을 마무리하기위한 다른 메커니즘을 제공합니다. 프라이팬 블록 대신
명령문을 사용합니다. 다음은 파일이있는 예입니다.import json<br>import yaml<br><br>def parse_file(filename):<br> try:<br> return json.load(open(filename))<br> except json.JSONDecodeError<br> return yaml.load(open(filename))<br>
query()
객체를 통해 사용할 수 있지만 예외 핸들러에서 close_db_connection()
메소드를 사용하는 경우 파이썬 로깅 시스템은 귀하의 모든 관련 정보를 추출합니다. finally
.이 패턴을 따르는 경우 (올바르게 로깅을 설정하더라도) 문제가 발생했는지에 대한 로그에서 꽤 좋은 기록을 가질 수있게되면 문제를 해결할 수있게되면 예외를 다시 제외하면 다른 수준 이상으로 다시 로그를 올릴 수 없습니다. 그것은 낭비이며, 당신을 혼란스럽게하고 같은 문제의 여러 인스턴스가 발생했다고 생각하게 만들 수 있습니다. 실제로 단일 인스턴스가 여러 번 기록되었을 때.
이를 수행하는 가장 간단한 방법은 모든 예외를 전파하는 것입니다 (자신이 자신있게 처리 할 수 있고 일찍 처리 할 수없는 한). 기능. 가장 일반적인 구현은 로그 파일을 사용하는 것입니다. 그러나 수백, 수천 개 이상의 서버가있는 대규모 분산 시스템의 경우 항상 최상의 솔루션은 아닙니다.def f():<br> return 4 / 0<br>def g():<br> raise Exception("Don't call us. We'll call you")<br>def h():<br> try:<br> f()<br> except Exception as e:<br> print(e)<br> <br> try:<br> g()<br> except Exception as e:<br> print(e)<br>
아래는 Sentry가 Python 응용 프로그램의 오류를 보여주는 방법을 보여주는 스크린 샷입니다.
그리고 여기에 오류가 발생하는 파일의 상세한 스택 추적이 있습니다. 일부 실패는 일시적으로 일시적으로 처리됩니다. 문제의 첫 징후에서 괴롭힘을당하는 시스템은 그다지 유용하지 않습니다.코드가 응답하지 않는 일부 원격 시스템에 액세스하는 경우 기존 솔루션이 타임 아웃이지만 때로는 모든 시스템이 타임 아웃으로 설계되지는 않습니다. 조건이 변경됨에 따라 타임 아웃은 항상 교정하기가 쉽지 않습니다.
또 다른 접근 방식은 빠르게 실패한 다음 다시 시도하는 것입니다. 이점은 대상이 빠르게 반응하는 경우 수면 상태에서 많은 시간을 소비 할 필요가 없으며 즉시 반응 할 수 있다는 것입니다. 그러나 실패하면 실제로 도달 할 수 없다고 결정할 때까지 여러 번 다시 시도하고 예외를 제기 할 수 있습니다. 다음 섹션에서는 당신을 위해 그것을 할 수있는 데코레이터를 소개합니다.유용한 데코레이터
오류 처리에 도움을 줄 수있는 두 개의 데코레이터는여기에 사용하는 방법은 다음과 같습니다. Decorator. Python은 예외 기반 오류 처리를 위해 언어 및 표준 라이브러리에서 큰 지원을 제공합니다. 모범 사례를 부지런히 따르면, 당신은 종종 무시되는 측면을 정복 할 수 있습니다.
이 게시물은 Esther Vaati의 기여로 업데이트되었습니다. Esther는 Envato Tuts의 소프트웨어 개발자이자 작가입니다.위 내용은 파이썬으로 전문 오류 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!