Programing

JavaScript에서 가능한 {}를 catch하지 않고 {}을 시도 하시겠습니까?

crosscheck 2020. 8. 28. 06:52
반응형

JavaScript에서 가능한 {}를 catch하지 않고 {}을 시도 하시겠습니까?


뭔가를 반환하거나 오류를 던지는 함수가 많이 있습니다. 주 함수에서 이들 각각을 호출하고 각 함수에서 반환 된 값을 반환하거나 첫 번째 함수에서 오류가 발생하면 두 번째 함수로 이동하고 싶습니다.

그래서 기본적으로 내가 현재 가지고있는 것은 :

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 {}는 (사용되지 않은) catch {}블록 이 없기 때문에 실패합니다 .

jsFiddle에 예제를 넣었습니다 .

그렇다면 catch동일한 효과를 내면서 해당 블록을 제거 할 수있는 방법이 있습니까?


아뇨. 보관해야합니다.

오류를 조용히 무시해서는 안되기 때문에 이것은 실제로 의미가 있습니다.


시도 없이 캐치 절은 다음으로 높은 자사의 오류를 전송 캐치 그 시도 내에서 정의 된 캐치가없는 경우, 또는 창.

catch 가 없으면 try 식에 finally 절이 필요합니다 .

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

아니요, catch(또는 finally)은 try친구이고 항상 try / catch의 일부입니다 .

그러나 귀하의 예와 같이 비워 두는 것은 완벽하게 유효합니다.

예제 코드의 주석 ( func1에서 오류가 발생하면 func2를 시도하십시오 )에서 실제로 원하는 catch것은 이전 블록 내에서 다음 함수를 호출하는 것 같습니다 .


ES2019로 시작하여 오류 변수없이 빈 catch 블록을 가질 수 있습니다 . 이를 선택적 catch 바인딩 이라고하며 2018 년 6 월에 릴리스 된 V8 v6.6 에서 구현되었습니다 . 이 기능은 Node 10 , Chrome 66 , Firefox 58 , Opera 53Safari 11.1 부터 사용할 수 있습니다 .

구문은 다음과 같습니다.

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

여전히 catch블록이 필요 하지만 비어있을 수 있으며 변수를 전달할 필요가 없습니다. catch 블록을 전혀 원하지 않는 경우 try/를 사용할 수 finally있지만 빈 catch가 수행하는 것처럼 오류를 삼키지 않습니다.

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


내 자신의 테스트에서 try 블록과 finally 블록 throw 오류가 모두 발생하면 finally 절에서 발생한 오류가 버블 링되고 try 블록의 오류가 무시되기 때문에 catch없이 try-finally를 권장하지 않습니다.

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

그것들은 내가 아는 모든 언어 (JavaScript, Java, C #, C ++)로 통합됩니다. 하지마.


나는 다른 각도에서 제시된 문제를보기로 결정했다.

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

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

try:catch is placed within a for loop allowing graceful fall through. while being able to iterate through all the functions needed. when explicit error handling is needed additional function array is used. in the even of error and functional array with error handlers element is not a function, error is dumped to console.

Per requirements of stackoverflow here is the code inline [edited to make JSLint compliant (remove leading spaces to confirm), improve readability]

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], [], []));


If you only want functions 2 and 3 to fire if an error occurs why are you not putting them in the catch block?

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

try & catch are like 2 side of one coin. so not possible without try.


Since ES2019 you can easily use try {} without catch {}:

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

For more info please reffer to Michael Ficcara's proposal

참고URL : https://stackoverflow.com/questions/5764107/try-without-catch-possible-in-javascript

반응형