뭔가를 반환하거나 오류를 던지는 함수가 많이 있습니다. 주 함수에서 이들 각각을 호출하고 각 함수에서 반환 된 값을 반환하거나 첫 번째 함수에서 오류가 발생하면 두 번째 함수로 이동하고 싶습니다.
그래서 기본적으로 내가 현재 가지고있는 것은 :
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 53 및 Safari 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], [], []));