source

자바스크립트에서 캐치 {} 없이 {} 시도가 가능합니까?

ittop 2023. 10. 19. 22:46
반응형

자바스크립트에서 캐치 {} 없이 {} 시도가 가능합니까?

저는 무언가를 반환하거나 오류를 던지는 여러 가지 기능을 가지고 있습니다.주 함수에서는 이들을 각각 호출하고, 각 함수가 반환한 값을 반환하거나, 첫 번째 함수가 오류를 발생시킬 경우 두 번째 함수로 진행하고 싶습니다.

그래서 기본적으로 제가 현재 가지고 있는 것은 다음과 같습니다.

function testAll() {
    try { return func1(); } catch(e) {}
    try { return func2(); } catch(e) {} // If func1 throws error, try func2
    try { return func3(); } catch(e) {} // If func2 throws error, try func3
}

하지만 사실은 저는 오직try반환합니다(즉, 오류가 발생하지 않는 경우).나는 필요하지 않습니다.catch블록. 하지만 코드라이크.try {}unused이(가) 누락되어 실패합니다.catch {}막다른 골목

저는 jsFiddle에 예를 들었습니다.

그래서, 그런 것들을 가질 수 있는 방법은 없을까요?catch동일한 효과를 달성하면서 블록을 제거할 수 있습니까?

캐치 절이 없는 시도는 해당 시도 내에 정의된 캐치가 없는 경우 오류를 다음 상위 캐치, 즉 창으로 보냅니다.

캐치볼이 없는 경우 시도 식을 사용하려면 마지막 절이 필요합니다.

try {
    // whatever;
} finally {
    // always runs
}

ES2019부터 에러 변수 없이 빈 캐치 블록이 가능합니다.이를 옵션 캐치 바인딩이라고 하며 2018년 6월에 출시된 V8 v6.6에 구현되었습니다.이 기능은 노드 10, 크롬 66, 파이어폭스 58, 오페라 53, 사파리 11.1부터 사용할 수 있습니다.

구문은 다음과 같습니다.

try {
  throw new Error("This won't show anything");
} catch { };

당신은 여전히 필요합니다.catch블록은 비어 있을 수 있으며 변수를 전달할 필요가 없습니다.캐치블럭을 전혀 원하지 않으신다면, 사용하실 수 있습니다.try/finally, 하지만 빈 캐치가 하는 것처럼 실수를 삼키지는 않을 것입니다.

try {
  throw new Error("This WILL get logged");
} finally {
  console.log("This syntax does not swallow errors");
}

.catch(또는finally는 )입니다.try그의 친구이자 항상 그곳에서 시도/catch의 일부로.

그러나 예제에서와 같이 이 값을 비워 두는 것이 완벽하게 유효합니다.

예제 코드의 댓글(func1이 오류를 던지면 func2를 시도해보세요)에서 당신이 정말로 하고 싶은 것은 내부에서 다음 함수를 호출하는 것처럼 보일 것입니다.catch앞의 블록

저는 시도 블록과 마지막으로 블록 던지기 오류가 모두 발생하면 마지막 절에 던져진 오류가 거품이 일면서 시도 블록의 오류가 무시되기 때문에, 제 자신의 테스트에서, 저는 캐치하지 않고 시도하는 것을 추천하지 않습니다.

try {
  console.log('about to error, guys!');
  throw new Error('eat me!');
} finally {
  console.log ('finally, who cares');
  throw new Error('finally error');
}

결과:

>     about to error, guys!
>     finally, who cares
>     .../error.js:9
>         throw new Error('finally error');
>         ^
>     
>     Error: finally error

아니요, 캐치가 없는 블록 시도(또는 마지막)는 불가능합니다.이를 해결하기 위해 다음과 같은 도우미 기능을 정의할 수 있습니다.

function tryIt(fn, ...args) {
    try {
        return fn(...args);
    } catch {}
}

다음과 같이 사용할 수 있습니다.

tryIt(function1, /* args if any */);
tryIt(function2, /* args if any */);

저는 제시된 문제를 다른 각도에서 보기로 했습니다.

다른 주석자가 나열한 처리되지 않은 오류 개체를 부분적으로 해결하면서 요청한 코드 패턴을 면밀하게 허용할 수 있는 방법을 결정할 수 있었습니다.

코드는 @ http://jsfiddle.net/Abyssoft/RC7Nw/4/ 에서 볼 수 있습니다.

시도: catch는 포 루프 내에 배치되어 우아한 낙하를 허용합니다.필요한 모든 기능을 반복할 수 있습니다.명백한 오류 처리가 필요한 경우 추가 함수 배열이 사용됩니다.오류가 발생하고 오류 핸들러 요소가 있는 함수 배열이 함수가 아닌 경우 오류는 콘솔에 덤프됩니다.

스택 오버플로의 요구 사항별로 인라인 코드가 있습니다. [JSLint를 준수하도록 편집됨(확인할 수 있는 선행 공간 제거, 가독성 향상]

function func1() {"use strict"; throw "I don't return anything"; }
function func2() {"use strict"; return 123; }
function func3() {"use strict"; throw "I don't return anything"; }

// ctr = Code to Run <array>, values = values <array>, 
// eh = error code can be blank.
// ctr and params should match 1 <-> 1
// Data validation not done here simple POC
function testAll(ctr, values, eh) {
    "use strict";
    var cb; // cb = code block counter
    for (cb in ctr) {
        if (ctr.hasOwnProperty(cb)) {
            try {
                return ctr[cb](values[cb]);
            } catch (e) {
                if (typeof eh[cb] === "function") {
                    eh[cb](e);
                } else {
                    //error intentionally/accidentially ignored
                    console.log(e);
                }
            }
        }
    }
    return false;
}

window.alert(testAll([func1, func2, func3], [], []));

오류가 발생하면 함수 2와 3만 실행되도록 하려면 왜 catch block에 넣지 않습니까?

function testAll() {
  try {
    return func1();
  } catch(e) {
    try {
      return func2();
    } catch(e) {
      try {
        return func3();
      } catch(e) {
        // LOG EVERYTHING FAILED
      }
    }
  }
}

...is there any way to have those catch blocks removed whilst achieving the same effect?자바스크립트에서는 시도 블록 다음에 캐치 블록이나 마지막 블록이 필요합니다.

그럼에도 불구하고, 원하는 효과를 얻기 위해 이러한 캐치 블록을 사용하는 방법이 있습니다.

// If func1 throws error, try func2if throws error 조건은 캐치 블록의 용도입니다.

사용법이 정확히 당신이 원하는 것인데 왜 그것들을 제거합니까?

try { return func1(); }
catch {
   // if func1 throws error
   try { return func2(); } 
   catch {
      // if func2 throws error
      try { return func3(); } 
      catch {
         // if func3 throws error
      }
   }
}

캐치 블록이 필요 없는 이유를 완전히 이해합니다. 그리고 완전히 생략하는 것이 더 깔끔합니다.하지만 저는 이것이 그런 상황 중 하나가 아니라고 생각합니다.

JS에서 빈 블록 코드를 표시하는 또 다른 방법은 다음과 같습니다./* empty */. 내 말은:

try {
    // your code here
} catch { /* empty */ }

그들은 내가 알고 있는 모든 언어(자바스크립트, 자바, C#, C++)에서 함께 사용됩니다.하지 마세요.

ES2019부터 간편하게 사용하실 수 있습니다.try {}없이.catch {}:

try {
  parseResult = JSON.parse(potentiallyMalformedJSON);
} catch (unused) {}

자세한 내용은 마이클 피카라의 제안을 참조하시기 바랍니다.

try & catch는 한 동전의 양면과 같습니다.그래서 시도하지 않으면 불가능합니다.

아뇨, 보관하셔야 돼요

오류는 조용히 무시해서는 안 되기 때문에 이것은 사실 말이 됩니다.

언급URL : https://stackoverflow.com/questions/5764107/is-try-without-catch-possible-in-javascript

반응형