프롬프트
file: 활용-9-3-마이크로파이썬의 일반적인 오류 처리 방법.md
프롬프트 영역으로 마우스를 옮기고 Copy 버튼을 누르면 클립보드에 프롬프트의 내용이 복사됩니다.마이크로파이썬에서 사용할 수 있는 일반적인 오류 처리 방법에 대해 설명해 줘.
AI가 만든 결과
MicroPython은 Python 3의 문법과 기능을 상당 부분 차용하고 있지만, 임베디드 환경을 겨냥해 용량과 성능을 최적화한 버전입니다. 따라서 일반적인 Python 코드와 유사하게 try-except
구문을 이용하여 오류(예외)를 처리할 수 있습니다. 다만 표준 라이브러리의 일부가 빠져 있거나, 일부 기능이 축소된 경우가 있으므로 이 점을 유의하면 됩니다. 아래에서는 MicroPython에서 주로 사용하는 오류(예외) 처리 방식을 간단히 정리해 봅니다.
1. 기본 try-except
구문
Python과 마찬가지로, 오류가 발생할 가능성이 있는 코드를 try
블록 안에 두고, 해당 오류를 처리하기 위해 except
블록을 사용합니다.
try: x = 10 y = 0 result = x / y # ZeroDivisionError가 발생 except ZeroDivisionError: print("0으로 나눌 수 없습니다.")
try
블록 내부에서ZeroDivisionError
가 발생하면,except ZeroDivisionError:
이하 구문이 실행됩니다.- 발생할 수 있는 예외 유형(예:
ValueError
,TypeError
등)에 따라except
를 여러 개 둘 수도 있습니다.
try: # 예외가 발생할 수 있는 코드 ... except ZeroDivisionError: # 0으로 나누었을 때 ... except TypeError: # 타입이 맞지 않을 때 ... except Exception as e: # 그 외 모든 예외 처리 ...
MicroPython에서도 이러한 예외 처리는 일반적인 Python 코드와 동일하게 동작합니다.
2. try-except-else
구문
가끔 예외가 발생하지 않았을 때만 실행하고 싶은 로직이 있다면, else
블록을 사용할 수 있습니다. 이 문법 또한 표준 Python과 동일합니다.
try: # 예외가 발생할 수 있는 부분 result = some_function() except SomeError: print("오류가 발생했습니다.") else: # 예외가 발생하지 않았을 때만 실행 print("정상적으로 실행되었습니다.")
3. finally
블록
자원 정리나 반드시 수행해야 하는 로직(파일 닫기, 연결 종료 등)이 있을 때는 finally
블록을 사용합니다. 예외 발생 여부와 관계없이 finally
블록은 항상 실행됩니다.
try: f = open("data.txt") content = f.read() except OSError: print("파일을 열거나 읽는 중 오류가 발생했습니다.") finally: # 예외 발생 여부와 관계없이 파일을 닫는 로직 수행 f.close()
마찬가지로, MicroPython에서 finally
블록도 Python과 동일하게 동작합니다.
4. 예외(Exception
) 일으키기 (raise
)
Python과 마찬가지로, 특정 조건에서 직접 예외를 일으키고 싶다면 raise
문을 사용합니다. 필요에 따라 사용자 정의 예외 클래스를 정의하거나, 적절한 내장 예외 타입을 재사용할 수 있습니다.
def safe_divide(a, b): if b == 0: raise ZeroDivisionError("b는 0이 될 수 없습니다.") return a / b try: result = safe_divide(10, 0) except ZeroDivisionError as e: print("오류:", e)
5. 사용자 정의 예외
MicroPython에서도 일반적인 Python 코드처럼 예외 클래스를 만들어 사용할 수 있습니다. 다만 임베디드 환경 특성상 클래스나 코드를 너무 복잡하게 설계하면 메모리를 많이 사용할 수 있으니 주의가 필요합니다.
class MyError(Exception): pass def do_something(): raise MyError("사용자 정의 예외가 발생") try: do_something() except MyError as e: print("사용자 정의 예외 처리:", e)
6. MicroPython에서 자주 만나는 예외
MicroPython 표준 라이브러리에 포함된 대표적인 예외 유형은 다음과 같습니다.
OSError
: 파일 시스템 접근, 소켓 통신 등에서 I/O 오류가 발생할 때ValueError
: 잘못된 값을 인자로 받았을 때TypeError
: 인자의 타입이 올바르지 않을 때ZeroDivisionError
: 0으로 나누기 시도KeyboardInterrupt
: 사용자가 Ctrl + C를 눌렀을 때(일부 환경에서)MemoryError
: 할당할 수 있는 메모리가 부족할 때
이외에도 Python 일반 예외들(NameError
, IndexError
, KeyError
등)이 대부분 포함되지만, 일부 내장 예외가 제외되어 있거나 축소된 경우가 있을 수 있습니다.
7. 예외 정보를 더 자세히 확인하기
MicroPython에서도 except Exception as e:
구문으로 예외 객체를 받아올 수 있고, print(e)
를 통해 메시지를 확인할 수 있습니다. sys.print_exception(e)
를 사용하면 스택 트레이스(Traceback)를 더 자세히 출력할 수도 있습니다.
import sys try: 1 / 0 except Exception as e: print("오류 메시지:", e) sys.print_exception(e) # Traceback 전체 출력
- 일부 MicroPython 포트(플랫폼)에서는
sys.print_exception
함수를 지원하지 않을 수도 있지만, 일반적으로 최신 버전에서는 사용 가능합니다.
8. 주의 사항
메모리 제약
- MicroPython이 동작하는 환경은 일반적인 PC 환경보다 훨씬 적은 메모리를 가지고 있습니다. 복잡한 예외 처리 구조나 중첩된 예외를 남발하면 메모리 사용량이 많아질 수 있으니 주의가 필요합니다.
표준 라이브러리 제한
- MicroPython에는 표준 Python에 비해 축소된 라이브러리가 많습니다. 예외 타입이나 예외 처리 시 호출하는 함수가 일부 빠져 있을 수 있으므로, 실제 사용 환경(펌웨어 버전 등)에서 가능한 기능을 확인해야 합니다.
빠른 예외 처리
- 임베디드 환경에서는 “오류 발생 → 예외 처리 → 복원(Recovery)” 과정을 가능하면 빠르게 처리하고, 필요하면 장치를 재시작(리셋)하는 전략을 취하기도 합니다. 이는 시스템 신뢰도를 높이기 위해 자주 쓰이는 방법입니다.
결론
MicroPython에서의 오류(예외) 처리 방법은 기본적으로 다음과 같이 요약할 수 있습니다:
try-except
구문으로 발생할 수 있는 예외를 처리한다.- 필요한 경우
finally
블록을 사용하여 자원 정리 등 필수 동작을 수행한다. - 직접 예외를 일으키려면
raise
를 사용하고, 사용자 정의 예외도 Python과 유사하게 만들 수 있다. - 임베디드 환경의 메모리 및 라이브러리 제약을 고려하여 예외 처리를 설계한다.
즉, 문법적으로는 표준 Python과 매우 유사합니다. 다만 MicroPython 환경 특성(메모리 제약, 라이브러리 축소 등)을 염두에 두고, 너무 복잡한 예외 구조나 불필요한 예외 남발을 피하는 것이 중요합니다.