python
많은 사람들이 예외를 잘못된 방식으로 처리하는 것을 봅니다. 아마도 이것은 당신에게도 적용될 것입니다. 다음 상황이 익숙합니까?
코드를 작성하고 있지만 사용 중인 라이브러리에서 예외가 발생할 수 있다는 것을 알고 있습니다. 당신은 정확히 기억하지 못합니다. 이 시점에서 소위 catch-all 블록을 사용하고 재미있는 것을 계속하고 싶은 유혹이 있습니다.
목차
<내비>당신이 할 수 있는 최악의 일은 무엇이든 잡아내는 try-except 블록을 만드는 것입니다. 포괄이란 다음과 같은 것을 의미합니다.
try: ... except: pass
다음과 같은 포괄적인 차단은 다음과 같은 이유로 좋지 않습니다.
또한, KeyboardInterrupt
을(를) 포함하여 모든 것을 catch하지 않으면 빈 예외가 발생합니다. (control + c), SystemExit
, 심지어 NameErrors
! 즉, 다음 코드를 완전히 중지할 수 없습니다.
from time import sleep while True: try: print("Try and stop me") sleep(1) except: print("Don't.. stop.. me now!")
부담 없이 사용해 보세요. 이 프로그램을 중지하려면 터미널 창을 닫거나 Python 프로세스를 종료해야 합니다.
대조적으로 except Exception
을 사용하는 경우 , 여전히 너무 많은 예외를 포착하는 빠르고 더러운 방법이지만 적어도 실행 중인 프로세스를 제대로 중지할 수 있습니다.
from time import sleep while True: try: print("Try and stop me") sleep(1) except Exception: print("Ok I'll stop!")
Exception
을 잡을 때 SystemExit
을 잡지 못할 것입니다. , KeyboardInterrupt
및 기타 그러한 예외. 왜 그러세요?
모든 예외는 BaseException
이라는 클래스에서 상속됩니다. . 공식 문서에 따르면:“try
except
가 있는 문 특정 클래스를 언급하는 절에서 해당 절은 해당 클래스에서 파생된 모든 예외 클래스도 처리합니다." 빈 except
except BaseException
와 동일합니다. , 따라서 가능한 모든 예외를 포착합니다.
대조적으로 Exception
클래스는 "모든 내장된 비시스템 종료 예외는 이 클래스에서 파생됩니다. 모든 사용자 정의 예외도 이 클래스에서 파생되어야 합니다."
다음 예에서는 os 라이브러리를 사용하여 현재 작업 디렉토리를 가져옵니다. 그러나 내 뚱뚱한 작은 손가락이 오타를 만들었습니다.
import os try: working_dir = os.getcdw() print(working_dir) except: print('error')
os.getcdw
이기 때문에 os 모듈의 함수가 아닌 경우 NameError가 발생합니다. 실패하는 대신, except 절은 오류를 잡아내고 '오류'를 출력하고 우리의 노골적인 오타에도 불구하고 프로그램은 계속될 것입니다. 불행히도 이 문제는 Exception
을(를) 잡아서 해결할 수 없습니다. 어느 쪽이든!
분명히 1단계의 작은 트릭이 모든 문제를 해결하는 것은 아닙니다. 따라서 해야 하는 우리는?
예외에 대해 자주 듣는 문구는 다음과 같습니다. 처리할 수 있는 것을 잡아라 . 많은 개발자는 예외를 직접 처리하고 싶은 유혹을 받지만 실제로 예외를 처리할 수 있는 프로그램의 일부로 예외가 전파되도록 하는 것이 더 나은 경우가 많습니다.
예를 들어, 파일을 열고 로드하는 텍스트 편집기의 일부를 생각해 보십시오. 이를 OpenFile
라고 부르겠습니다. 수업. 사용자가 존재하지 않는 파일을 열도록 요청한 경우 해당 오류를 직접 처리하거나 전파하도록 할 수 있습니다.
이 경우 호출자에게 예외를 전파하는 것이 좋습니다. OpenFile
이 예외가 호출자에게 얼마나 나쁜지 모릅니다. 발신자는 여러 가지 방법으로 상황을 처리할 수 있습니다.
어느 쪽이든 OpenFile
가 아닙니다. FileNotFoundError
의 경우 수행할 작업을 결정하는 클래스 .
그렇다면 예외는 항상 전파되어야 합니까? 아니요. FileOpen 클래스에서 처리할 수 있는 가능한 예외는 TimeoutError
입니다. . 예를 들어, 호출자를 오류로 괴롭히지 않고 몇 번 재시도할 수 있습니다. OpenFile
처리할 수 있으므로 잡아서 다시 시도하는 것이 좋습니다.
어떤 상황에서도 처리할 수 있는 것보다 더 많은 예외를 catch해서는 안 됩니다. 블록을 제외한 블랭킷은 버그와 예측할 수 없는 코드의 레시피입니다. 즉, 처리할 수 있는 것을 잡으십시오.
'처리할 수 있는 것을 잡아라'라는 매트릭스를 염두에 두고 코드를 작성하는 경우 포괄 블록을 작성하는 것은 모든 규칙을 위반하는 것입니다. 그러니 제발 그만하세요. 연습으로 기존 코드 중 일부를 다시 방문하여 이 새로운 지식으로 개선할 수 있는지 확인할 수 있습니다!
python
이 기사를 보게 된 가장 가능성 있는 원인은 현재 필라멘트를 제대로 공급할 수 없는 3D 프린터가 있기 때문입니다. 따라서 이 소개를 짧게 만들고 다음 질문에 대한 답으로 바로 가보겠습니다. 현재 필라멘트를 공급하지 않는 3d 프린터를 어떻게 고칠 수 있습니까? 3D 프린터가 필라멘트를 공급하지 않는 주요 원인은 압출 경로를 따라 막힘, 손상된 PTFE 튜브, 잘못된 수축 설정, 원치 않는 필라멘트 장력, 너무 높은(또는 너무 낮은) 압출 온도, 막힘 노즐 또는 마모입니다. 드라이버 기어. 이 문제 목록은 각 원인을 개별적으로
3D 프린팅 문제는 신규 사용자와 숙련된 사용자 모두에게 공통적입니다. 3D 프린터는 설정에 관계없이 중앙이 아닌 모서리에서 인쇄를 시작할 수 있습니다. 프린터는 또한 부적절한 인쇄 디자인과 뒤틀림을 생성하거나 말림 효과를 일으킬 수 있습니다. 이러한 문제는 주로 3D 프린터를 설정할 때 여러 가지 원인으로 인해 발생합니다. 3D 프린터가 중앙에서 인쇄되지 않습니까? 3D 프린터가 중앙에 인쇄되지 않는 것은 재료와 시간의 낭비이며 끔찍한 경험입니다. 확실히 통제해야 합니다. 이 문제는 주로 필요한 적절한 소프트웨어와 관