[javascript] 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
}


답변

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");
}


답변

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

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

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


답변

내 자신의 테스트에서 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는 for 루프 내에 배치되어 우아한 폴 스루를 허용합니다. 필요한 모든 기능을 반복 할 수 있습니다. 명시 적 오류 처리가 필요한 경우 추가 함수 배열이 사용됩니다. 오류 처리기 요소가있는 오류 및 기능 배열에서도 함수가 아닌 경우 오류가 콘솔에 덤프됩니다.

stackoverflow의 요구 사항에 따라 여기에 코드 인라인이 있습니다. [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], [], []));