JavaScript의 Go 스타일 오류 처리에 대한 설명

Barbara Streisand
풀어 주다: 2024-10-16 16:32:02
원래의
219명이 탐색했습니다.

A take on Go Style Error Handling in JavaScript

매일 JavaScript를 사용하는 거의 모든 사람들은 try-catch가 처리하기 어려울 수 있다는 것을 알고 있습니다. 특히 처리해야 할 오류가 두 개 이상 있을 경우 더욱 그렇습니다.

제안된 대부분의 솔루션은 모든 것을 반환 값으로 처리하는 Golang의 접근 방식을 복사하려고 합니다. 무엇보다도 Go의 큰 특징이지만 JS는 완전히 다른 언어이고(ㅋㅋㅋ) Go에서 복사하여 붙여넣는 것보다 더 잘할 수 있다고 생각합니다.

Go에서는 오류를 처리하고 싶을 때 오류를 튜플의 두 번째 값이나 함수 호출의 반환 값으로 함수 호출에서 반환합니다. 다음은 패턴입니다:

result, error := DoSomething()
if error != nil {
 // handle error
}
로그인 후 복사

이 접근 방식을 사용하면 표준 제어 흐름을 사용하여 오류를 명시적으로 처리할 수 있습니다.

자바스크립트에서 이 패턴을 적용하기 위한 가장 일반적인 해결책은 결과를 배열로 반환하는 것입니다.

const handler = async (promise) => {
  try {
    const result = await promise()
    return [result, null];
  } catch(error) {
    return [null, error];
  }
}

const [response, error] = await handle(fetch('http://go.gl'))
if (error !== null) {
  // handle error
}
로그인 후 복사

보시다시피 이것은 Go의 패턴을 거의 직접 복사하여 붙여넣은 것입니다.

일관된 값 반환

이 패턴은 훌륭하게 작동하지만 자바스크립트에서는 이보다 더 나은 결과를 얻을 수 있습니다. 이 패턴의 핵심 아이디어는 오류를 값으로 반환하는 것이므로 더 나은 SoC에 적용해 보겠습니다.

null이나 Error를 반환하는 대신 일관된 인터페이스로 결과를 꾸밀 수 있습니다. 그러면 SoC가 향상되고 강력한 형식의 반환 값이 제공됩니다.

interface Status {
  Ok(): boolean;
  Fail(): boolean;
  Of(cls: any): boolean;
}
로그인 후 복사

인터페이스 Status는 Error일 필요는 없지만 status.Of(Error)를 사용하여 유형을 확인할 수 있습니다. 우리는 언제든지 Status를 만족하는 객체를 반환할 수 있습니다. 사용 예는 다음과 같습니다.

const [response, error] = await handle(res.json())
if (error.Of(SyntaxError)) {
  // handle error
  console.log("not a json")
  return
}
로그인 후 복사

이제 JavaScript에서는 결과가 항상 튜플일 필요는 없습니다. 필요할 때 튜플로 작동하는 자체 클래스를 실제로 만들 수 있습니다.

interface IResult<T> {
  0: T;
  1: Status;
  value: T;
  status: Status;
  Of(cls: any): boolean;
  Ok(): boolean;
  Fail(): boolean;
}
로그인 후 복사

사용 예:

const result = await handle(res.value.json())
if (result.Of(SyntaxError)) {
  // handle error
  console.log("not a json")
  return
}
로그인 후 복사

구현

이 접근 방식에 따라 바로 사용할 수 있는 기능인 그립을 만들었습니다.

그립은 강력한 타입으로 기능과 약속을 모두 장식할 수 있습니다.

저는 git을 사용하여 이러한 패키지를 호스팅하므로 설치하려면 github을 사용하세요.

bun add github:nesterow/grip # or pnpm
로그인 후 복사

용법:

그립 함수는 함수나 Promise를 수락하고 반환 값 및 상태와 함께 결과를 반환합니다.
결과는 객체나 튜플로 처리될 수 있습니다.

import { grip } from '@nesterow/grip';
로그인 후 복사

결과를 객체로 처리합니다.

결과는 객체로 처리될 수 있습니다: {value, status, Ok(), Fail(), Of(type)}

const res = await grip(
  fetch('https://api.example.com')
);

if (res.Fail()) {
    handleErrorProperly();
    return;
}

const json = await grip(
  res.value.json()
);

if (json.Of(SyntaxError)) {
    handleJsonParseError();
    return;
}

로그인 후 복사

결과를 튜플로 처리합니다.

Go'ish 스타일로 오류를 처리하려는 경우 결과를 튜플로 수신할 수도 있습니다.

const [res, fetchStatus] = await grip(
  fetch('https://api.example.com')
);
if (fetchStatus.Fail()) {
    handleErrorProperly();
    return;
}

const [json, parseStatus] = await grip(
  res.json()
);
if (parseStatus.Of(SyntaxError)) {
    handleJsonParseError();
    return;
}
로그인 후 복사

오류 처리가 마음에 드신다면 저장소를 확인해 보세요. 소스는 유형이 없을 경우 50LOC 정도, 유형이 있을 경우 100 정도입니다.

위 내용은 JavaScript의 Go 스타일 오류 처리에 대한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!