bgerror — 백그라운드 오류 처리 명령

bgerror — 백그라운드 오류 처리 명령

이벤트 핸들러 안에서 일어난 오류는 "누가 보고해야 하지?"라는 애매한 상황에 빠져요. Tcl 8.5부터는 interp bgerror로 이런 백그라운드 오류를 처리할 핸들러를 등록할 수 있는데, 그 이전 버전과의 호환성을 위해 bgerror라는 이름의 명령으로도 처리할 수 있었습니다. 이 문서는 그 bgerror 명령의 인터페이스 요구사항을 설명해요.

출처: bgerror manual page

본문

bgerror message

Tcl 8.5부터 interp bgerror 명령을 지원하며, 애플리케이션이 인터프리터에 그 인터프리터의 백그라운드 오류를 처리할 명령을 등록할 수 있게 해 줍니다. 그 이전 릴리스에서는 이런 제어 수준이 없어서, 애플리케이션은 인터프리터의 전역 네임스페이스에 bgerror라는 정확한 이름의 명령을 만들어야만 백그라운드 오류 처리를 제어할 수 있었어요. 아래 문서는 Tcl 8.5 이전 릴리스와 호환성을 유지하려는 애플리케이션이 정의할 수 있는 bgerror 명령의 인터페이스 요구사항을 설명합니다. Tcl 8.5 이후만 지원하려는 애플리케이션은 그냥 interp bgerror를 쓰면 됩니다.

bgerror 명령은 Tcl의 내장된 일부로 존재하지 않아요. 대신 개별 애플리케이션이나 사용자가 백그라운드 오류를 처리하고 싶다면 bgerror 명령(Tcl 프로시저로)을 정의할 수 있습니다.

백그라운드 오류란 이벤트 핸들러나 애플리케이션에서 시작되지 않은 다른 명령에서 발생하는 오류예요. 예를 들어 after 명령으로 지정한 명령 실행 중 오류가 나면 그것이 백그라운드 오류입니다. 백그라운드가 아닌 오류는 중첩된 Tcl 명령 평가를 타고 올라가 애플리케이션의 최상위 코드에 도달해, 애플리케이션이 원하는 방식으로 보고할 수 있어요. 백그라운드 오류가 발생하면, 언와인딩이 Tcl 라이브러리에서 끝나고 Tcl이 오류를 보고할 뚜렷한 방법이 없습니다.

Tcl이 백그라운드 오류를 감지하면 오류에 대한 정보를 저장하고, 나중에 idle 이벤트 핸들러로 interp bgerror가 등록한 핸들러 명령을 호출합니다. 기본 핸들러 명령은 차례로 bgerror 명령을 호출해요. bgerror를 호출하기 전에 Tcl은 errorInfoerrorCode 변수를 오류가 발생한 시점의 값으로 복원한 뒤, 오류 메시지를 유일한 인자로 bgerror를 호출합니다. Tcl은 애플리케이션이 bgerror 명령을 구현했고, 그 명령이 애플리케이션에 의미 있는 방식으로 오류를 보고할 것이라고 가정합니다. 오류가 발생하지 않는 한 Tcl은 bgerror 명령이 리턴하는 어떤 결과도 무시합니다.

bgerror 명령 안에서 또 다른 Tcl 오류가 발생하면(예를 들어 bgerror 명령이 정의되지 않았기 때문에) Tcl은 스스로 stderr로 메시지를 써서 오류를 보고합니다.

bgerror가 호출되기 전에 백그라운드 오류가 여러 개 누적되면, bgerror는 각 오류에 대해 발생 순서대로 한 번씩 호출됩니다. 그런데 bgerror가 break 예외로 리턴하면 나머지 오류들은 bgerror를 호출하지 않고 건너뜁니다.

남들이 패키지나 라이브러리의 일부로 사용할 코드를 작성한다면 bgerror를 피하는 것을 고려해 보세요. 그 이유는 애플리케이션 프로그래머도 자체 bgerror를 정의하거나, 그렇게 하는 다른 코드를 써서 여러분의 코드를 통합하는 데 어려움을 겪을 수 있기 때문입니다.

예시

bgerror 프로시저는 오류를 타임스탬프와 함께 파일에 추가합니다.

proc bgerror {message} {
    set timestamp [clock format [clock seconds]]
    set fl [open mylog.txt {WRONLY CREAT APPEND}]
    puts $fl "$timestamp: bgerror in $::argv '$message'"
    close $fl
}

더 알아보기

  • after, errorCode, errorInfo, interp — 백그라운드 오류의 발생과 처리
  • 키워드: background error, reporting