openlang

물려받은 통합 문서와 On Error Resume Next

물려받은 통합 문서를 아무거나 열어 보면 모듈 머리 아래 첫 줄이 거의 똑같아요. On Error Resume Next. 위험한 호출 하나를 감싼 것도 아니고, 맨 위에서 전부를 덮고 있죠.

어쩌다 거기 들어갔는지는 뻔해요. 누군가의 매크로가 런타임 오류로 멈추고, 다른 누군가가 그 줄을 붙여 넣고, 매크로는 더 이상 멈추지 않고, 다들 넘어가요. (대신 실패하던 줄이 하던 일도 이제 안 하는데, 그건 아무도 못 봐요.) 이 문은 On Error GoTo 0을 만나거나 프로시저가 끝날 때까지 유효해서, 긴 Sub 안에서는 원래 말썽이던 줄보다 훨씬 넓은 범위를 덮어요.

또 하나의 단골은 Option Explicit 없는 모듈이에요. 변수 이름을 잘못 치면 늘 비어 있는 새 Variant가 조용히 생기고, 합계는 그래도 그럴듯해 보여요.

이건 VBA 문법 문제가 아니에요. 다음 사람이 어떤 오류가 예상된 것이었는지 알 수 없을 때 생기는 일이에요. 제 처방은 심심해요. 편집기에서 변수 선언 요구 옵션을 켜서 새 모듈에 Option Explicit이 붙게 하고, 위험한 호출 하나만 On Error Resume Next, Err.Number 확인, On Error GoTo 0 순서로 감싸요.

이어지는 대화 4

서로의 근거를 따라
  1. 고유 링크

    아, 이건 정말 모르는 사이에 써져요. Python에서는 제너레이터가 행을 돌면서 try 안에서 파싱하다가 예외가 나면 그냥 continue 해요. 필터처럼 읽혀요. 실제로도 필터예요. 가장 들여다봐야 했던 행들을 조용히 버리는 필터요.

    저한테 도움이 된 건 건너뛴 걸 보이게 만드는 거였어요. 제너레이터는 멀쩡한 행만 내보내고, 문제 있는 행은 예외와 함께 호출한 쪽이 돌려받는 리스트에 쌓아요. 아니면 범위를 좁혀서 맨 except 대신 except ValueError만 잡고 나머지는 올라오게 두고요. 결국 말씀하신 것과 같은 조언이에요. Err.Number 철자만 다를 뿐이죠.

    혹시 VBA에서도 건너뛴 행을 기록해 두나요, 아니면 통합 문서에 그건 너무 거창하다고 보나요?

  2. 고유 링크

    언어 문제이기도 합니다. 오류를 묻는 데 한 줄이고 확인하는 데 다섯 줄이면 사람들은 묻어 버립니다. TypeScript에도 같은 습관이 있고, 예의만 더 바를 뿐입니다. 파싱한 JSON 본문에 as Invoice를 붙이거나 도우미 함수 하나에서 any가 새어 나가게 두면, 빨간 밑줄이 런타임 오류가 사라졌던 것과 똑같이 사라집니다. 컴파일러는 불평을 멈춥니다. 데이터는 여전히 네트워크로 들어온 그대로입니다.

    검사가 일어났어야 할 자리에 캐스트가 있습니다. 들어오는 지점에서 한 번 검증하고, 그 뒤로는 좁히기가 실제 정보를 안쪽으로 나르게 하십시오. 그 밖의 방법은 타입 검사기에 거는 On Error Resume Next입니다.

  3. 고유 링크

    value = parse(row) rescue nil은 캐스트조차 귀찮은 사람을 위한 Ruby의 한 줄짜리 버전이에요. StandardError라면 뭐든 잡아서 nil을 건네주고, 그 nil은 메서드 세 개쯤 건너간 뒤에야 누군가의 불평을 듣죠. 정말 중요한 이유로 실패한 거라도 nil은 똑같이 생겼어요.

  4. 고유 링크

    ES2019부터 catch 바인딩을 생략할 수 있게 돼서 try { load() } catch {}가 JavaScript에서 모든 걸 삼키는 제일 짧은 합법적 방법이 됐어요. 같은 병이에요. 통합 문서 쪽은 그래도 파일 하나 안에 있잖아요. JS에서는 보통 패키지 세 단계 아래, 프로젝트의 누구도 열어 본 적 없는 곳에 있어요.

같은 질문의 다른 갈래

  1. 순환 참조 리뷰 코멘트에는 소유자를 적어 주세요

    “그냥 다 weak로 쓰세요” 같은 리뷰 코멘트에는 작성자가 딱히 대답할 게 없어요. 클래스 인스턴스가 콜백을 저장하고, 그 콜백이 같은 인스턴스를 강하게 캡처하는 경우를 놓고 보죠. 작성자가 실제로 붙잡고 이야기할 수 있는…

    답글 1swift