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


114

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

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

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동일한 효과를 내면서 해당 블록을 제거 할 수있는 방법이 있습니까?

답변:


4

아뇨. 보관해야합니다.

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


16
이 경우 이러한 기능에 오류가 있지만 반환 예를 던져하지 말아야 null당신은 같은 것을 할return func1() || func2() || func3();
ThiefMaster

52
이 대답은 사실 틀 렸습니다 try {}; finally {}. stackoverflow.com/a/5764505/68210
Daniel X Moore

4
@DanielXMoore가 없으면에서 catch (e) {}발생한 예외 가 시도 func1()되지 func2()않습니다.
binki 2014-04-02

65
때로는 빈 캐치를 갖는 것이 완벽하게 이해되기 때문에 나는 당신의 주장에 동의하지 않습니다.
Petr Peller

8
이 답변은 사실적으로 부정확하고 오해의 소지가 있습니다. "실제로 이치에 맞습니다"라고 말하지만 당신은 틀 렸으며, 어떤 경우에만 의미가 있고 다른 경우에는 의미가 없습니다. 설명 할 수없이 받아 들여지는 끔찍한 대답의 좋은 예입니다. async때로는 함수 에서와 같이 catch 블록이없는 것이 합당한 경우가 많습니다 . 자바 스크립트 언어에 의해 빈 catch블록 을 생성하도록 강요받는 것은 분명히 무의미합니다.
YungGun

236

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

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

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

그래서 가장 좋은 방법은 다음과 같이 작성하는 것입니다 try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}.
user2284570

1
위의 설명은 함수 1이 성공하면 함수 2를 실행하고 싶지 않기 때문에 OP에 정확하게 대답하지 않습니다.
Andrew Steitz


그것이 내가 필요했던 것입니다. 감사합니다 :-) try {} 없이도 작동한다면 정말 굉장 할 것입니다. )}} 전체 함수가 의미하는 것은 분명합니다 ;-) 그 try 블록은 거기에 너무 추합니다 ...
Lenny

35

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


2
이 답변은 최신입니다! 실행 순서 측면에서 1. try블록을 시도합니다 . 2. 오류를 포착합니다. 3. finally블록을 실행합니다 . 4. 오류가 발생합니다. 이 올바른지?
helsont

감사합니다 @helsont. 두 번째 코드 샘플의 실행 순서에 관해서는 오류가 포착되어 다시 발생하는지 아니면 그냥 (아마도) 단순히 던져지고 처음에 잡히지 않았는지 (아마 없습니다) 알 수 있는지 모르겠습니다 catch. 전체 코드를 다른 try/로 둘러싸면catchThis WILL get logged 오류 를 포착 할 수 있습니다 .
Dan Dascalescu 19

이제 훨씬 깨끗해 보입니다. 공유해 주셔서 감사합니다!
LeOn-Han Li

10

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

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

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


1
당신이 맞습니다. 그러나 같은 코드 try {...}; try {...}가 가능 하다면 코드 의 의미가 더 명확해질 수 있습니다 (첫 번째 시도, 그렇지 않으면 두 번째 시도).
pimvdb 2011

편집 정보 : JSFiddle 예제에서 두 번째 함수가 무언가를 반환하므로이 경우 세 번째 함수가 실제로 평가됩니까? 나는 return성명서가 그 뒤에 오는 것을 막는다 고 생각 했습니다.
pimvdb 2011

@pimvdb 죄송합니다. 바이올린을 확인하지 않았습니다. return함수가 조기에 반환되도록합니다. 내 답변을 업데이트하겠습니다.
alex

1
이 대답은 사실 틀 렸습니다 try {}; finally {}. stackoverflow.com/a/5764505/68210
Daniel X Moore

1
@DanielXMoore 물론 그렇습니다.하지만 finally{}기본적으로 catch{}. 답변을 업데이트하겠습니다.
알렉스

6

내 자신의 테스트에서 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

1

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


1
5 년 후 여기에 다른 답변과 같은 내용을 말했을 때 내 것이 비추천되었습니다. 내 것이 유일하게 반대표를받은 것으로 보입니다. 중재자 여러분, 참고하십시오.
duffymo 2014

Tcl은 매우 편리한 한 단어의 구조를 가지고catch {my code}
MKaama


왜? 그것이 시도 / 마지막하지 않는 한 쓸모 없다고 느낍니다.
duffymo

1

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

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

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


1

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

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

0

다음과 같은 도우미 기능을 사용해야한다고 생각합니다.

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

다음과 같이 사용하십시오.

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.