javascript 에는 try-catch 블록이 제공됩니다 . Java 또는 다른 언어에서는 오류 처리가 필수적이지만 Javascript에서 더 큰 오류를 사용하는 사람은 없습니다. 좋은 습관입니까, 아니면 자바 스크립트에서 필요하지 않습니까?
javascript 에는 try-catch 블록이 제공됩니다 . Java 또는 다른 언어에서는 오류 처리가 필수적이지만 Javascript에서 더 큰 오류를 사용하는 사람은 없습니다. 좋은 습관입니까, 아니면 자바 스크립트에서 필요하지 않습니까?
답변:
throw
응용 프로그램에서 오류 조건을 전달하는 방법으로 오류를 피해야 합니다.
throw
문은 "이런 일이없고, 충돌 및 굽기 안 들어. 어떤 방식으로 우아하게 복구 안 함"을 사용한다
try catch
그러나 호스트 객체 또는 ECMAScript가 오류를 발생시킬 수있는 상황에서 사용됩니다.
예:
var json
try {
json = JSON.parse(input)
} catch (e) {
// invalid json input, set to null
json = null
}
node.js 커뮤니티의 권장 사항은 콜백에서 오류를 전달하는 것입니다 (오류는 비동기 작업에만 발생하므로).
fs.readFile(uri, function (err, fileData) {
if (err) {
// handle
// A. give the error to someone else
return callback(err)
// B. recover logic
return recoverElegantly(err)
// C. Crash and burn
throw err
}
// success case, handle nicely
})
try / catch와 같은 다른 문제도 실제로 비싸며 추악하고 비동기 작업에서는 작동하지 않습니다.
따라서 동기식 작업은 오류를 발생시키지 않아야하며 비동기식 작업에서는 작동하지 않으므로 호스트 객체 또는 ECMAScript에서 발생한 오류를 제외하고 아무도 try catch를 사용하지 않습니다.
Error
있지만 그 사이는 거의 없습니다.
document.getElementById
요소가 존재하지 않을 때는 던지지 않고 그냥 반환합니다 null
. 거의 모든 경우에 동일하게 적용 가능
Javascript의 try / catch는 Javascript의 비동기 특성으로 인해 다른 언어 에서처럼 방탄하지 않습니다. 이 스 니펫을 고려하십시오.
try {
setTimeout(function() {
do_something_that_throws();
}, 1000);
}
catch (e) {
alert("You won't see this!");
}
문제는 제어 흐름 이 실행 try
되기 전에 블록을 떠나 do_something_that_throws()
므로 콜백 내부에서 발생하는 오류는 포착되지 않는다는 것입니다.
따라서 try / catch는 기본적으로 대부분의 경우 부적절하며 코드가 비동기 적으로 실행되는지 여부가 항상 명확하지는 않습니다. 다행스럽게도 고유 한 단일 스레드 비동기 콜백 관용구와 실제 클로저에 대한 지원을 갖춘 Javascript는 연속 전달 스타일 오류 처리와 같은 우아한 대안을 제공합니다. 함수로서 오류에 대한 올바른 응답을 전달하십시오. 예 :
setTimeout(function () {
do_something_that_calls_err(function(err) {
alert("Something went wrong, namely this: " + err);
}),
1000);
이러한 답변 중 상당수는 약간 오래되었으며 새로운 ES7 기능 async
과 를 고려하지 않았습니다 await
.
async
/ await
를 사용 하면 원하는대로 비동기 제어 흐름을 얻을 수 있습니다.
async function email(address) {
try {
// Do something asynchronous that may throw...
await sendEmail({ to: address, from: 'noreply@domain.com`, subject: 'Hello' })
} catch(err) {
if (err instanceof SomeCustomError) {
elegantlyHandleError(err)
} else {
throw err
}
}
})
async
/ await
here 에 대해 자세히 알아보십시오 . babel을 사용 async
하거나 await
지금 사용할 수 있습니다 .
Javascript의 try-catch는이를 구현하는 다른 언어와 마찬가지로 유효하고 유용합니다. 다른 언어 에서처럼 자바 스크립트에서 많이 사용되지 않는 주된 이유가 있습니다. Javascript가 추악한 스크립팅 언어로 보이는 것과 동일한 이유는 사람들이 Javascript 프로그래머가 실제 프로그래머가 아니라고 생각하는 것과 같은 이유입니다.
많은 사람들이 브라우저에 의해 지원되는 유일한 언어 덕분에 자바 스크립트에 노출된다는 사실은 전문가가 아닌 코드가 많이 있다는 것을 의미합니다. 물론 몇 가지 사소한 이유가 있습니다.
catch
(비동기식)어쨌든 try-catch를 사용해야 하지만 프로그래밍의 다른 모든 것과 마찬가지로 올바르게 사용하는 방법을 배워야합니다 .
try..catch
JavaScript에서 드물게 발생 하는 많은 이유 는 언어에 오류에 대한 내성이 매우 높기 때문 이라고 생각합니다 . 대부분의 상황은 코드 확인, 양호한 기본값 및 비동기 이벤트를 사용하여 처리 할 수 있습니다. 경우에 따라 단순히 패턴을 사용하면 문제를 방지 할 수 있습니다.
function Foo() {
//this may or may not be called as a constructor!!
//could accidentally overwrite properties on window
}
function Bar() {
if (!(this instanceof Bar)) {
return new Bar();
}
//this will only work on Bar objects, and wont impact window
}
예외가 발생하는 다른 언어의 주요 문제 중 일부는 JS에 존재하지 않습니다. 대부분의 경우 유형 캐스팅이 필요하지 않습니다. 대신 선호되는 방법은 일반적으로 기능 검사 (특정 인터페이스 적용)입니다.
function doFoo(arg) {
if (arg.foo) {
arg.foo();
} else {
Bar.prototype.foo.call(arg);
}
}
언어 에 async
/ await
를 추가하면 try..catch
점점 더 널리 퍼지고 있습니다. 의 비동기 형식으로 약속하지만 다음과 같이 try..catch
기대해야합니다.
doSomething().then(
doSomethingWithResult,
doSomethingWithError
)
대신 다음과 같이 작성하십시오.
try {
const result = await doSomething()
doSomethingWithResult(result)
} catch (e) {
doSomethingWithError(e)
}
try / catch가 Javascript에서 많이 사용되지 않는 또 다른 이유는 첫 번째 버전의 Javascript에서 구문을 사용할 수 없기 때문에 나중에 추가 된 것입니다.
결과적으로 일부 구형 브라우저는이를 지원하지 않습니다. (실제로, 일부 구형 브라우저에서는 파서 / 구문 오류가 발생할 수 있습니다. 이는 대부분의 다른 유형의 오류보다 "방어 적으로 프로그래밍"하기가 더 어렵습니다.
더 중요한 것은 처음에는 사용할 수 없었기 때문에 처음 릴리스 된 Javascript 내장 함수 (많은 언어에서 "라이브러리"함수라고 함)는이 함수를 사용하지 않습니다. ( "throw"하지 않고 문제가 발생했을 때 "null"을 반환하는 경우 someobject.somefunction ()에서 오류를 "잡아내는"작업은 매우 효과적이지 않습니다.
또 다른 가능한 이유는 try / catch 메커니즘이 처음에는 필요하지 않은 것 같습니다 (그리고 여전히 유용한 것은 아닙니다). 통화가 일상적으로 여러 수준으로 중첩 된 경우에만 필요합니다. 일종의 ERRNO를 반환하면 직접 호출에 제대로 작동합니다 (사용 가능한 경우 항상 유용하게 사용 하기는하지만 대부분의 언어에서 가장 좋은 방법은 깊게 중첩 된 호출이 아닌 모든 곳 에서 사용하는 것입니다). Javascript 로직은 원래 작고 단순해야했지만 (결국 웹 페이지 :-에 대한 보조 일 뿐임) 함수 호출은 깊이 중첩되지 않았으므로 try / catch 메커니즘이 필요하지 않은 것 같습니다.
Javascript 클라이언트 측 코드에서 예외를 throw하면 페이지를 디버깅하기가 더 어려워서 많이 사용되지 않는다고 생각합니다.
오히려 예외를 던지는 것보다, 내가 일반적으로 알 경고 상자를 표시하는 것을 선호 (예 alert("Error, invalid...");
)
이상하게 들릴지 모르지만 고객이 작성한 페이지를 사용하고 있고 기술에 정통한 리더 가 아니라면 고객이 말할 수있는 방법이 없다면 고객이 Javascript 오류가 발생합니다. 당신은 문제가 무엇입니까.
"X 페이지가 작동하지 않습니다!" 라는 말만으로 전화를 걸어 문제가 발생한 부분과 코드의 위치를 찾는 것은 전적으로 귀하의 책임입니다.
대신 경고 상자를 사용하면 전화를 걸거나 "X 페이지의 A 단추를 클릭하면 ..."라고 표시된 상자가 표시됩니다. "라고 믿으면 훨씬 쉽게 찾을 수 있습니다. 버그.
While in java or *any other language* it is mandatory to have error handling...
-아니에요 Java는 가능하지만 try-catch를 주장하지 않는 많은 언어가 있습니다 (예 : C #).