2010-04-06 4 views
10

확인. 여기에 머리카락을 나눌 수도 있지만 코드가 일관성이 없으므로 작성하고 싶습니다. 그러나 내가하기 전에, 내가 올바른 방향으로 가고 있는지 확인하고 싶습니다. 실제로이 문제는 중요하지 않지만 이것은 잠시 동안 나를 괴롭혀서 내 친구들에게 물어 보았습니다.JavaScript try/catch : 오류 또는 예외?

catch 블록에서 항상 try... catch 문을 사용할 때마다 항상 메시지를 기록합니다. 내 내부 콘솔. 그러나 내 로그 메시지가 일관성이 없습니다. 제대로

catch(ex) { 
DFTools.console.log("someMethod caught an exception: ",ex.message); 
... 

물론 어느 쪽이든 코드 기능을하지만 가끔 "오류"때로는에 "예외"를 참조하는 것이 귀찮게하기 시작하고있다 :

catch(err) { 
DFTools.console.log("someMethod caught an error: ",err.message); 
... 

나 : 그들 중 하나는 다음과 같다. 내가 말했듯이, 아마도 머리카락을 나눌거야하지만 이라는 용어가 적절합니까? "예외"또는 "오류"? 이 오류 인 경우

+0

나는 이것을 항상 "예외 처리"라고 불렀지 만, catch 블록을 트리거하면 새로운 오류 ("...")가 발생합니다 ... – Josh

+5

그럼 원하는 것을 던질 수 있습니다. "안녕 엄마!";는 완벽하게 유효합니다. – Pointy

+0

예. 어쩌면 나는 새로운 오류 객체 또는 Error를 상속받은 객체를 던져 버리라는 말을해야 할 것이다. – Josh

답변

11

이것은 약간 주관적이지만 나에게 누군가 나 무언가가 잘못되었거나 부적절하거나 잘못되었을 때 오류가 발생합니다. 구문 오류, 논리 오류, 읽기 오류, 사용자 오류 또는 사회적 오류 일 수 있습니다. 그것은 추상적 인 개념입니다.

반면에 예외는 코드에서 특정 조건이 발생할 때 생성되고 throw되는 객체입니다. 개념적 오류 일 수도 있고 아닐 수도 있습니다. 그래서 나에게 적절한 명칭은 "예외"입니다.

+0

나는 이것을 좋아한다. 나에게 의미가있다. – Josh

+3

OK. 친구와 함께 주제에 대해 토론 한 후, 나는이 대답을 받아 들일 것을 진지하게 고려하고있다. 여기 내 생각이야. 당신이 말한 내용을 주석에서 언급 한대로 취하면 : 당신은 무엇이든 던질 수 있습니다. 어떤 'catch'가 잡아도 예외는 아닙니다. 예외가 오류 일 수 있습니다. 따라서 '예외'가 적절한 용어입니다. – Josh

+0

감사합니다. 나는 하루 동안 나의 한계를 쳤다. 그래서 당신이 원하는만큼 많은 시간을 가져라. – tloflin

0

은 당신이 catch 블록에서 얻을 것은 예외이다, 그래서 나는

... 예외로 이름을 - 나는 내 코드 나는 보통 기대하지 않습니다 &에서 처리 할 수 캐치 블록에서 확인하십시오.

HTH.

1

예를 들어 파일 열기 시도에서 예상 할 수있는 예외는 "파일을 찾을 수 없음 예외"가 발생할 수 있습니다. 반면에 오류는 스택 오버 플로우 나 메모리가 부족한 것처럼 보이지 않을 수도 있습니다.

논리 결과를 생성하지 않는 함수에서 벗어나는 대체 논리 방법은 예외입니다. 예외는 또한 왜 이런 식으로 존재하는지에 대한 더 나은 설명을 허용합니다. 파일 열기의 경우 다시 파일 핸들은 논리적 인 결과이며 파일이 존재하지 않는 경우 (가능한 한 예외) 또는 파일이 아닌 폴더 인 경우 (다른 가능한 예외).

+0

+1 : 이것은 내 주제와 비슷합니다. 예외는 예상 될 수 있지만 오류는 그렇지 않을 수 있습니다. – CAbbott

+0

그래서 내가 올바르게 당신을 이해한다면, 실제로 일어난 일에 근거하여 기록해야한다고 제안합니까? 즉, 오류 일 때와 예외 일 때를 결정합니다. IE는 AJAX 호출에 대한 try/catch 블록 일 경우 예외이지만 메모리 부족 오류는 오류입니다. – Josh

+0

예외는 논리 결과를 생성하지 않는 함수에서 벗어나는 대체 방법입니다. 예외는 또한 왜 이런 식으로 존재하는지에 대한 더 나은 설명을 허용합니다. 파일 열기의 경우 다시 파일 핸들은 논리적 인 결과이며 파일이 존재하지 않는 경우 (가능한 한 예외) 또는 파일이 아닌 폴더 인 경우 (다른 가능한 예외). 이 상황에서 나는 예외를 사용할 것이다. 따라서 AJAX 호출은 예외를 throw해야합니다. :-D – NawaMan

1

JavaScript에서는 오류 캐칭이라고합니다. 그래서 당신이 예외 대신 오류를 사용하는 것이 좋습니다 것입니다. "e"를 사용하여 중간에 선택 항목을 남겨 둡니다. 모질라의 예와 같습니다. Mozilla Core JavaScript 1.5 Reference

+1

Ahhh ...하지만 http://w3schools.com/js/js_throw.asp에서 "throw 문을 사용하면 예외를 만들 수 있습니다." – Josh

+2

w3schools는 최종 참조 사이트가 아닌 자습서 세트입니다. –

+0

@Daniel : 감사합니다. 그것 CSmooth.net의 대답을 의심 – Josh

4

ECMAScript specification은 예외를 호출합니다. 마찬가지로 할 수도 있습니다.

catch(ex) { 
    DFTools.console.log("someMethod caught an exception of type " 
     + ex.name + ": ", ex.message); 

당신은 또한 예외가 (불행히도) 모든 유형이 될 수 염두에 두어야 할 수 있습니다, 그래서 반드시 namemessage 속성이없는 :

은 로깅이 더 많은 정보를 확인하려면

을 이 같이
catch(ex) { 
    if (ex.message && ex.name) {   
     DFTools.console.log("someMethod caught an exception of type " 
      + ex.name + ": ", ex.message); 
    } else /* deal with it somehow */ 

사방 반복 꽤 성가신 보이기 시작, 당신은 함수를 캡처 할 수 있습니다

이제 당신은 말할 수 :

logExceptions(function() { 

    // do some risky stuff... 

}); 
+0

HA! 실제로 ECMAScript 사양은 "오류 예외"를 호출합니다! – Josh

+2

그래, 모든 표준 예외 생성자는 Exception보다는 Error를 사용하지만 JS는 당신을위한 것이다! :) 그러나 그 예외 함수는 오류를 나타 내기 때문에 가정합니다. 예외의 다른 용도는 그렇지 않을 수도 있습니다. 예를 들어, Mozilla의 JavaScript 1.7에는 "generators"라는 확장명이 있습니다.이 확장명은 시퀀스의 끝을 나타내는 예외를 사용하며 예외 유형은 'StopIteration'입니다. "오류"는 언급되지 않습니다. 그래서 광기에 어떤 방법이있을 수 있습니다 ... –

+0

@Josh - 위의 내 답장은 편집하기 전에 원래의 주석에 대한 것이므로, 내장 된 예외 생성자가 "오류"라는 단어를 사용하는 이유를 묻습니다. 새로운 대답은 : 당신은 어떤 spec을 읽고 있습니까? 내가 링크 된 버전은 예외를 "예외"로 지칭합니다. "오류 예외"라는 용어를 사용하여 오류를 나타내는 예외를 구체적으로 나타냅니다. 그것은 모두 예외는 아닙니다. –

1

주요 면책 조항 : 나는이에 "오른쪽"답이 있다고 생각하지 않는다. 여기에 표현 된 견해는 주관적이고 개인적인 것입니다. 더 많은 것은, 내가 생각하고있는 아이디어는 다른, 에헴, 단점을 가지고 다른 일을 할 경우에만 유용하다는 것입니다 ... 다니엘 얼 위커 (Daniel Earwicker)의 유익한 대답에 따라 시스템을 사용하는 것처럼 말입니다. 이를 염두에두고 :

나는 "예외는 예외"라고 주장합니다. 오류는 덜 예기치 않습니다.

면책 조항 : 다음의 의사 코드는 좋지 않습니다. 그것은 단지 나의 요점을 설명하기 위해 생각할 수있는 최소한의 경우입니다.

참고 :이 생각 실험에서, GetFile은 지정된 파일을 찾을 수없는 경우 UNDEFINED를 반환합니다.

function AlwaysGetFile(name){ 
    var file = null; 
    if(FileExists(name)){ 
     file = GetFile(name); 
     if(typeof file === "undefined"){ 
      throw new "couldn't retrieve file" EXCEPTION 
     } 
    } 
    else{ 
     throw new "file does not exist" ERROR 
    } 
    return file; 
} 

소비자가 존재하지 않는 파일 이름으로 GetFileOrThrow를 호출하는 경우 오류가 발생합니다. 내 마음에 구별은 정말 더 높은 수준의 코드 (또는 사용자 입력) 뭔가 잘못하고있다 ...이 함수는이 결과에 대해 무엇을 결정할 수있는 높은 수준의 코드 줄에 오류를 전달해야합니다. 이처럼 고려 ...이 기능은 소모 기능을 말하는 것 :

Look, my friend, I know what's going on here: it is an ERROR to request BobAccounts.xml, so don't do it again! Oh, and if you think you now know what might have gone wrong (having abused me), go ahead and try to recover from it!

지금 몇 가지 이유를 검색하는 데 실패에 대해이 함수는 다음, 이름을 걸리는 파일이 있는지 확인하고있는 경우를 고려한다. 이것은 다른 상황입니다. 정말 예기치 않은 일이 일어났습니다. 게다가, 소비 코드 을 비난해서는 안됩니다. 이제 우리는 정말이 함수가 소모 기능에하고 싶은 말 :

Oh fiddlesticks! Sorry about this, I humbly beg your pardon but something EXCEPTIONAL that I don't really understand has gone wrong. I don't think that your request for BobAccounts.xml was unreasonable... and I know I should be fulfilling it for you. Since I'm lower level code than you, I really ought to know what's going on... but I don't... and since you've less chance than me of understanding this EXCEPTIONAL situation, I think you'd probably best just stop what you're doing and let this message go all the way to the top... I mean, there is something seriously fishy going on here.

그래서 나는 내 요약이 가정하자 : 실수가 높은 순서 코드에서 발생하는 경우 오류가 발생 (당신이 잘못된 데이터를 통과했다). 실수가 저 순서 코드 (당신이 의존 한 함수가 이해하지 못했고 계획 할 수없는 방식으로 실패한 경우)에서 예외가 발생하면 ... 현재 실수로 함수를 작성하고 있습니다. 글쎄, 이런, 네가 알고 있다면 그걸 고쳐라!

마지막으로 원본 질문에 직접 답하십시오. 오류 및 예외 처리 측면에서 내 조언은 다음과 같습니다. 모든 오류를 정상적으로 처리합니다 (선택적으로 로깅 할 수 있음). 그러나 예외 처리를 신중하게 처리하십시오. 정말로 무엇이 무엇인지 그리고 그것이 일어난 이유를 알고 있다면 EXCEPTION에서 회복하려고 노력하십시오. 그렇지 않으면 거품을 일으키게하십시오 (당신이해야한다면 그것을 다시 던지십시오).