NodeJS는 비동기 코드에서 예외 처리를 단순화하기 위해 도메인 모듈을 제공합니다. 이 모듈을 소개하기 전에 먼저 "도메인"의 개념을 이해해야 합니다. 간단히 말해서 도메인은 JS 실행 환경입니다. 실행 환경에서 예외가 발생하지 않으면 전역 예외로 발생합니다. NodeJS는 프로세스 객체를 통해 전역 예외를 캡처하는 방법을 제공합니다
.process.on('uncaughtException', function (err) { console.log('Error: %s', err.message); }); setTimeout(function (fn) { fn(); });
Error: undefined is not a function
전역 예외에는 잡을 수 있는 곳이 있지만, 대부분의 예외에 대해 가능한 한 빨리 이를 포착하고 결과에 따라 코드의 실행 경로를 결정하기를 바랍니다. 예시로 다음 HTTP 서버 코드를 사용합니다.
function async(request, callback) { // Do something. asyncA(request, function (err, data) { if (err) { callback(err); } else { // Do something asyncB(request, function (err, data) { if (err) { callback(err); } else { // Do something asyncC(request, function (err, data) { if (err) { callback(err); } else { // Do something callback(null, data); } }); } }); } }); } http.createServer(function (request, response) { async(request, function (err, data) { if (err) { response.writeHead(500); response.end(); } else { response.writeHead(200); response.end(data); } }); });
위 코드는 처리를 위해 요청 개체를 비동기 함수에 전달한 다음 처리 결과에 따라 응답을 반환합니다. 여기서는 콜백 함수를 사용하여 예외를 전달하므로 비동기 함수 내부에 비동기 함수 호출이 몇 개 더 있으면 코드는 위와 같습니다. 코드를 더 보기 좋게 만들기 위해 도메인 모듈을 사용하여 요청이 처리될 때마다 하위 도메인(JS 하위 런타임 환경)을 생성할 수 있습니다. 하위 도메인에서 실행되는 코드는 마음대로 예외를 발생시킬 수 있으며 이러한 예외는 하위 도메인 개체의 오류 이벤트를 통해 균일하게 캡처될 수 있습니다. 따라서 위의 코드는 다음과 같이 수정할 수 있습니다.
function async(request, callback) { // Do something. asyncA(request, function (data) { // Do something asyncB(request, function (data) { // Do something asyncC(request, function (data) { // Do something callback(data); }); }); }); } http.createServer(function (request, response) { var d = domain.create(); d.on('error', function () { response.writeHead(500); response.end(); }); d.run(function () { async(request, function (data) { response.writeHead(200); response.end(data); }); }); });
보시다시피 .create 메소드를 사용하여 하위 도메인 객체를 생성하고, .run 메소드를 사용하여 하위 도메인에서 실행해야 하는 코드의 진입점을 입력합니다. 하위 도메인에 위치한 비동기 함수 콜백 함수는 더 이상 예외를 잡을 필요가 없으므로 코드가 갑자기 훨씬 더 얇아집니다.
함정
프로세스 객체의 uncaughtException 이벤트를 통해 전역 예외가 캡처되거나 하위 도메인 객체의 error 이벤트를 통해 하위 도메인 예외가 캡처되는 경우 NodeJS 공식 문서에서는 예외를 처리한 후 즉시 프로그램을 다시 시작하는 것보다 프로그램을 계속 실행하도록 합니다. 공식 문서에 따르면, 예외가 발생한 후 프로그램은 불확실한 실행 상태에 있으며, 즉시 종료되지 않으면 프로그램에 심각한 메모리 누수가 발생하거나 이상하게 동작할 수 있습니다.
그러나 여기서 몇 가지 사실을 명확히 해야 합니다. JS 자체의 throw..try..catch 예외 처리 메커니즘은 메모리 누수를 일으키지 않으며 프로그램의 실행 결과도 예상치 못한 일이 아니지만 NodeJS는 순수한 JS가 아닙니다. NodeJS의 많은 API는 내부적으로 C/C++로 구현됩니다. 따라서 NodeJS 프로그램을 실행하는 동안 코드 실행 경로가 JS 엔진 내부와 외부 사이를 왕복하며 JS의 예외 발생 메커니즘이 중단될 수 있습니다. 정상적인 코드 실행 흐름으로 인해 C/C++ 부분의 코드가 비정상적으로 동작하여 메모리 누수 및 기타 문제가 발생합니다.
따라서 예외를 catch하려면 uncaughtException이나 domain을 사용하세요. 코드 실행 경로에 C/C++ 코드가 포함될 경우 메모리 누수 및 기타 문제가 발생할지 확실하지 않은 경우 예외를 처리한 후 프로그램을 다시 시작하는 것이 좋습니다. . try 문을 사용하여 예외를 catch할 때 일반적으로 catch되는 예외는 JS 자체 예외이므로 항소에 대해 걱정할 필요가 없습니다.