Go와 같은 Javascript 오류 처리

소개?



오류 처리의 패턴이나 모양이 다른 것보다 더 편리한 것 같습니다. 컨텍스트와 예외가 발생했을 때 해야 할 일에 따라 오류를 다르게 처리하는 자신을 발견했습니다.

그런 다음 제가 사용하고 있는 오류를 처리하는 다양한 방법을 기록하고 새로운 것을 약간 실험하는 것이 유용할 수 있다고 생각했습니다.

이 기사에서는 데이터와 오류를 사용하는 일반적인 방법과 Go 프로그래밍 언어에서 일반적인 예외 처리에 접근하는 방법을 보여줍니다(면책 조항: 저는 Go 개발자가 아닙니다).

나는 async/Promise 기반 코드에 초점을 맞출 것입니다.

오류 처리, 대체 1




try {
  const data = await somethingThatCanFail()
  // do something with the `data`
} catch(error) {
  // handle the `error`
}


오늘날 오류를 처리하는 가장 일반적인 방법일 가능성이 높습니다.

오류 처리, 대체 2




somethingThatCanFail()
  .then((data) => { /* do something with the `data` */ })
  .catch((error) => { /* do something with the `error` */ })


반대로 async/await가 주류가 되기 전에 오류를 처리하는 가장 일반적인 방법입니다.

오류 처리, 대체 3




try {
  await somethingThatCanFail()
    .then((data) => { /* do something with the `data` */ })
} catch(error) {
  // handle the `error`
}


이것은 data 로 많은 작업을 수행할 필요가 없는 방식으로 사용할 수 있지만 error 를 처리하기 위해 간단한 작업 이상의 작업을 수행해야 합니다.
.then를 사용했지만 await가 필요합니다. 그렇지 않으면 문제가 있는 경우catch 얻을 수 없습니다.

오류 처리, 대체 4




const data = await somethingThatCanFail()
  .catch((error) => { /* do something with the `error` */ })
// do something with the `data`


이는 오류에 대해 많은 작업을 수행할 필요가 없거나 error 콜백 외부에서 catch 자체에 액세스할 필요가 없는 경우에 사용할 수 있습니다. try/catch 블록의 추가 중첩에서 "저장"되므로 문제를 보다 간결하게 처리하는 데 도움이 될 수 있습니다.

오류 처리, 아이디어



어디서도 이 접근 방식을 본 적이 없는 것 같아서 이 "모양"이 나에게 의미가 있는지 실험해 보고 싶었습니다.

내 생각은 기본적으로 오류를 값으로 처리하는 Go의 접근 방식을 빌리는 것입니다.

f, err := os.Open("filename.ext")
if err != nil {
    log.Fatal(err)
}
// do something with the open *File f


Go here: https://go.dev/blog/error-handling-and-go에서 오류 처리에 대한 자세한 내용을 읽을 수 있습니다.

최종 결과는 다음과 같을 것이라고 생각했습니다.

const [data, error] = await somethingThatCanFail()
if (error) {
  // handle the `error`
}


기본적으로 Promisearray 로 바뀌기를 원합니다. 다음과 같이 할 수 있습니다.

function promiseToArray(promise) {
   return promise
    .then(data => [data])
    .catch(error => [undefined, error]);
}

const [data, error] = await promiseToArray(somethingThatCanFail());
if (error) {
  // handle the `error`
}


그래서 우리는 거기에 있지만 여전히 구문이 마음에 들지 않습니다. 이것을 조금 개선해 봅시다 ...

Promise.prototype.toGo = function() {
  return this
    .then(data => [data])
    .catch(error => [undefined, error]);
};

const [data, error] = await somethingThatCanFail().toGo();
if (error) {
  // handle the `error`
}
// or conversely
if (!error) {
  // do something with the `data`
}


이제 나는 그것을 훨씬 더 좋아합니다. 우리는 Promise 프로토타입을 수정하고 있습니다. 이 프로토타입은 최선의 아이디어는 아닐 수 있지만 실험용으로는 훌륭해 보입니다.

마지막 생각들



이것을 사용해야합니까? 아마 좋은 생각이 아닐 것입니다. 개인적으로 나는 더 일반적으로 사용되는 패턴을 고수하고 싶습니다.

이 접근 방식은 일부 특정 사용 사례에 유용할 수 있으며, 이 아이디어가 실제로 유용한 다른 아이디어를 촉발할 수도 있습니다.

부인 성명



이 글을 쓰는 동안 누군가가 이미 나보다 훨씬 일찍 이것에 대해 생각했다는 것을 알았습니다. 이 기사를 확인하십시오.
https://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/

좋은 웹페이지 즐겨찾기