[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Ferror":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Ferror":2525,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Ferror":2551},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":2521,"stem":2522,"id":2523,"extension":2524},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Ferror","错误处理与调试","结构化错误类型、try\u002Fcatch 与全局未捕获处理是健壮应用的基础。","技能小册",[12,13],"javascript","error","2026-06-25",false,{"type":17,"value":18,"toc":2492},"minimark",[19,22,31,36,43,50,57,180,184,272,276,392,399,562,566,572,575,610,916,926,930,934,940,947,1058,1064,1074,1243,1247,1250,1333,1337,1343,1346,1434,1440,1442,1515,1526,1531,1618,1647,1653,1659,1749,1757,1831,1835,1839,1845,1848,1901,1913,1963,1967,2011,2014,2029,2081,2097,2101,2108,2127,2134,2138,2145,2152,2249,2256,2270,2283,2287,2302,2305,2416,2419,2422,2425,2488],[20,21,8],"h1",{"id":8},[23,24,25,26,30],"p",{},"结构化错误类型、",[27,28,29],"code",{},"try\u002Fcatch"," 与全局未捕获处理是健壮应用的基础。",[32,33,35],"h2",{"id":34},"一错误构造函数","一、错误构造函数",[23,37,38,39,42],{},"JavaScript 内置了多个错误构造函数，所有内置错误都继承自 ",[27,40,41],{},"Error"," 类。",[44,45,47,48],"h3",{"id":46},"_1-error","1. ",[27,49,41],{},[23,51,52,53,56],{},"最通用的错误类型，用于创建自定义错误。接受可选的 ",[27,54,55],{},"message"," 参数。",[58,59,64],"pre",{"className":60,"code":61,"language":62,"meta":63,"style":63},"language-js shiki shiki-themes material-theme-lighter github-light github-dark","const err = new Error(\"Something went wrong\");\nconsole.log(err.name); \u002F\u002F 'Error'\nconsole.log(err.message); \u002F\u002F 'Something went wrong'\nconsole.log(err.stack); \u002F\u002F 堆栈信息\n","js","",[27,65,66,111,138,159],{"__ignoreMap":63},[67,68,71,75,79,83,86,90,94,98,102,104,107],"span",{"class":69,"line":70},"line",1,[67,72,74],{"class":73},"sbsja","const",[67,76,78],{"class":77},"s_hVV"," err",[67,80,82],{"class":81},"smGrS"," =",[67,84,85],{"class":81}," new",[67,87,89],{"class":88},"sGLFI"," Error",[67,91,93],{"class":92},"su5hD","(",[67,95,97],{"class":96},"sjJ54","\"",[67,99,101],{"class":100},"s_sjI","Something went wrong",[67,103,97],{"class":96},[67,105,106],{"class":92},")",[67,108,110],{"class":109},"sP7_E",";\n",[67,112,114,117,120,123,126,128,131,134],{"class":69,"line":113},2,[67,115,116],{"class":92},"console",[67,118,119],{"class":109},".",[67,121,122],{"class":88},"log",[67,124,125],{"class":92},"(err",[67,127,119],{"class":109},[67,129,130],{"class":92},"name)",[67,132,133],{"class":109},";",[67,135,137],{"class":136},"sutJx"," \u002F\u002F 'Error'\n",[67,139,141,143,145,147,149,151,154,156],{"class":69,"line":140},3,[67,142,116],{"class":92},[67,144,119],{"class":109},[67,146,122],{"class":88},[67,148,125],{"class":92},[67,150,119],{"class":109},[67,152,153],{"class":92},"message)",[67,155,133],{"class":109},[67,157,158],{"class":136}," \u002F\u002F 'Something went wrong'\n",[67,160,162,164,166,168,170,172,175,177],{"class":69,"line":161},4,[67,163,116],{"class":92},[67,165,119],{"class":109},[67,167,122],{"class":88},[67,169,125],{"class":92},[67,171,119],{"class":109},[67,173,174],{"class":92},"stack)",[67,176,133],{"class":109},[67,178,179],{"class":136}," \u002F\u002F 堆栈信息\n",[44,181,183],{"id":182},"_2-特定错误类型","2. 特定错误类型",[185,186,187,200],"table",{},[188,189,190],"thead",{},[191,192,193,197],"tr",{},[194,195,196],"th",{},"构造函数",[194,198,199],{},"触发场景",[201,202,203,214,228,238,248,262],"tbody",{},[191,204,205,211],{},[206,207,208],"td",{},[27,209,210],{},"SyntaxError",[206,212,213],{},"代码语法错误（如缺少括号、非法变量名）",[191,215,216,221],{},[206,217,218],{},[27,219,220],{},"TypeError",[206,222,223,224,227],{},"值类型与预期不符（如调用非函数、读取 ",[27,225,226],{},"null"," 的属性）",[191,229,230,235],{},[206,231,232],{},[27,233,234],{},"RangeError",[206,236,237],{},"数值超出有效范围（如数组长度负数、递归栈溢出）",[191,239,240,245],{},[206,241,242],{},[27,243,244],{},"ReferenceError",[206,246,247],{},"引用未声明的变量（在严格模式下更常见）",[191,249,250,255],{},[206,251,252],{},[27,253,254],{},"URIError",[206,256,257,258,261],{},"全局 URI 处理函数（",[27,259,260],{},"decodeURI"," 等）传入了无效参数",[191,263,264,269],{},[206,265,266],{},[27,267,268],{},"EvalError",[206,270,271],{},"已废弃，不再使用",[273,274,275],"h4",{"id":275},"示例",[58,277,279],{"className":60,"code":278,"language":62,"meta":63,"style":63},"\u002F\u002F SyntaxError（解析阶段，如缺少括号）\n\u002F\u002F function foo( {\n\n\u002F\u002F TypeError\nconst n = null;\nn.toString();\n\n\u002F\u002F RangeError\nnew Array(-1);\n\n\u002F\u002F ReferenceError\nconsole.log(undeclaredVar);\n",[27,280,281,286,291,297,302,318,334,339,345,367,372,378],{"__ignoreMap":63},[67,282,283],{"class":69,"line":70},[67,284,285],{"class":136},"\u002F\u002F SyntaxError（解析阶段，如缺少括号）\n",[67,287,288],{"class":69,"line":113},[67,289,290],{"class":136},"\u002F\u002F function foo( {\n",[67,292,293],{"class":69,"line":140},[67,294,296],{"emptyLinePlaceholder":295},true,"\n",[67,298,299],{"class":69,"line":161},[67,300,301],{"class":136},"\u002F\u002F TypeError\n",[67,303,305,307,310,312,316],{"class":69,"line":304},5,[67,306,74],{"class":73},[67,308,309],{"class":77}," n",[67,311,82],{"class":81},[67,313,315],{"class":314},"s39Yj"," null",[67,317,110],{"class":109},[67,319,321,324,326,329,332],{"class":69,"line":320},6,[67,322,323],{"class":92},"n",[67,325,119],{"class":109},[67,327,328],{"class":88},"toString",[67,330,331],{"class":92},"()",[67,333,110],{"class":109},[67,335,337],{"class":69,"line":336},7,[67,338,296],{"emptyLinePlaceholder":295},[67,340,342],{"class":69,"line":341},8,[67,343,344],{"class":136},"\u002F\u002F RangeError\n",[67,346,348,351,354,356,359,363,365],{"class":69,"line":347},9,[67,349,350],{"class":81},"new",[67,352,353],{"class":88}," Array",[67,355,93],{"class":92},[67,357,358],{"class":81},"-",[67,360,362],{"class":361},"srdBf","1",[67,364,106],{"class":92},[67,366,110],{"class":109},[67,368,370],{"class":69,"line":369},10,[67,371,296],{"emptyLinePlaceholder":295},[67,373,375],{"class":69,"line":374},11,[67,376,377],{"class":136},"\u002F\u002F ReferenceError\n",[67,379,381,383,385,387,390],{"class":69,"line":380},12,[67,382,116],{"class":92},[67,384,119],{"class":109},[67,386,122],{"class":88},[67,388,389],{"class":92},"(undeclaredVar)",[67,391,110],{"class":109},[23,393,394,395,398],{},"可以用 ",[27,396,397],{},"instanceof"," 判断错误类型：",[58,400,402],{"className":60,"code":401,"language":62,"meta":63,"style":63},"try {\n    \u002F\u002F 可能抛出 TypeError 的代码\n} catch (err) {\n    if (err instanceof TypeError) {\n        console.error(\"类型错误\");\n    } else if (err instanceof RangeError) {\n        console.error(\"范围错误\");\n    } else {\n        console.error(\"其他错误\");\n    }\n}\n",[27,403,404,413,418,432,456,478,502,523,531,552,557],{"__ignoreMap":63},[67,405,406,410],{"class":69,"line":70},[67,407,409],{"class":408},"sVHd0","try",[67,411,412],{"class":109}," {\n",[67,414,415],{"class":69,"line":113},[67,416,417],{"class":136},"    \u002F\u002F 可能抛出 TypeError 的代码\n",[67,419,420,423,426,429],{"class":69,"line":140},[67,421,422],{"class":109},"}",[67,424,425],{"class":408}," catch",[67,427,428],{"class":92}," (err) ",[67,430,431],{"class":109},"{\n",[67,433,434,437,441,444,447,451,454],{"class":69,"line":161},[67,435,436],{"class":408},"    if",[67,438,440],{"class":439},"skxfh"," (",[67,442,443],{"class":92},"err",[67,445,446],{"class":81}," instanceof",[67,448,450],{"class":449},"sbgvK"," TypeError",[67,452,453],{"class":439},") ",[67,455,431],{"class":109},[67,457,458,461,463,465,467,469,472,474,476],{"class":69,"line":304},[67,459,460],{"class":92},"        console",[67,462,119],{"class":109},[67,464,13],{"class":88},[67,466,93],{"class":439},[67,468,97],{"class":96},[67,470,471],{"class":100},"类型错误",[67,473,97],{"class":96},[67,475,106],{"class":439},[67,477,110],{"class":109},[67,479,480,483,486,489,491,493,495,498,500],{"class":69,"line":320},[67,481,482],{"class":109},"    }",[67,484,485],{"class":408}," else",[67,487,488],{"class":408}," if",[67,490,440],{"class":439},[67,492,443],{"class":92},[67,494,446],{"class":81},[67,496,497],{"class":449}," RangeError",[67,499,453],{"class":439},[67,501,431],{"class":109},[67,503,504,506,508,510,512,514,517,519,521],{"class":69,"line":336},[67,505,460],{"class":92},[67,507,119],{"class":109},[67,509,13],{"class":88},[67,511,93],{"class":439},[67,513,97],{"class":96},[67,515,516],{"class":100},"范围错误",[67,518,97],{"class":96},[67,520,106],{"class":439},[67,522,110],{"class":109},[67,524,525,527,529],{"class":69,"line":341},[67,526,482],{"class":109},[67,528,485],{"class":408},[67,530,412],{"class":109},[67,532,533,535,537,539,541,543,546,548,550],{"class":69,"line":347},[67,534,460],{"class":92},[67,536,119],{"class":109},[67,538,13],{"class":88},[67,540,93],{"class":439},[67,542,97],{"class":96},[67,544,545],{"class":100},"其他错误",[67,547,97],{"class":96},[67,549,106],{"class":439},[67,551,110],{"class":109},[67,553,554],{"class":69,"line":369},[67,555,556],{"class":109},"    }\n",[67,558,559],{"class":69,"line":374},[67,560,561],{"class":109},"}\n",[32,563,565],{"id":564},"二自定义错误类继承-error","二、自定义错误类（继承 Error）",[23,567,568,569,571],{},"通过继承 ",[27,570,41],{}," 可以创建自定义错误类型，便于区分业务逻辑错误和系统错误。",[44,573,574],{"id":574},"最佳实践",[576,577,578,586,600],"ul",{},[579,580,581,582,585],"li",{},"自定义子类必须调用 ",[27,583,584],{},"super(message)","。",[579,587,588,589,592,593,596,597,599],{},"需要手动设置 ",[27,590,591],{},"name"," 属性和维护原型链（ES6 的 ",[27,594,595],{},"extends"," 会自动修复原型，但设置 ",[27,598,591],{}," 仍可取）。",[579,601,602,603,605,606,609],{},"可选地设置 ",[27,604,27],{},"、",[27,607,608],{},"status"," 等自定义属性。",[58,611,613],{"className":60,"code":612,"language":62,"meta":63,"style":63},"class ValidationError extends Error {\n    constructor(message, field) {\n        super(message);\n        this.name = \"ValidationError\";\n        this.field = field; \u002F\u002F 自定义属性\n        \u002F\u002F 维护堆栈（可选，ES6 后 prototype 已自动关联）\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, ValidationError);\n        }\n    }\n}\n\ntry {\n    throw new ValidationError(\"Invalid email\", \"email\");\n} catch (err) {\n    console.log(err.name); \u002F\u002F 'ValidationError'\n    console.log(err.message); \u002F\u002F 'Invalid email'\n    console.log(err.field); \u002F\u002F 'email'\n    console.log(err.stack); \u002F\u002F 堆栈信息\n}\n",[27,614,615,630,650,663,684,702,707,725,747,752,756,760,764,771,803,814,839,863,887,911],{"__ignoreMap":63},[67,616,617,620,623,626,628],{"class":69,"line":70},[67,618,619],{"class":73},"class",[67,621,622],{"class":449}," ValidationError",[67,624,625],{"class":73}," extends",[67,627,89],{"class":449},[67,629,412],{"class":109},[67,631,632,635,637,640,643,646,648],{"class":69,"line":113},[67,633,634],{"class":73},"    constructor",[67,636,93],{"class":109},[67,638,55],{"class":639},"s99_P",[67,641,642],{"class":109},",",[67,644,645],{"class":639}," field",[67,647,106],{"class":109},[67,649,412],{"class":109},[67,651,652,655,657,659,661],{"class":69,"line":140},[67,653,654],{"class":77},"        super",[67,656,93],{"class":439},[67,658,55],{"class":92},[67,660,106],{"class":439},[67,662,110],{"class":109},[67,664,665,668,670,672,674,677,680,682],{"class":69,"line":161},[67,666,667],{"class":314},"        this",[67,669,119],{"class":109},[67,671,591],{"class":92},[67,673,82],{"class":81},[67,675,676],{"class":96}," \"",[67,678,679],{"class":100},"ValidationError",[67,681,97],{"class":96},[67,683,110],{"class":109},[67,685,686,688,690,693,695,697,699],{"class":69,"line":304},[67,687,667],{"class":314},[67,689,119],{"class":109},[67,691,692],{"class":92},"field",[67,694,82],{"class":81},[67,696,645],{"class":92},[67,698,133],{"class":109},[67,700,701],{"class":136}," \u002F\u002F 自定义属性\n",[67,703,704],{"class":69,"line":320},[67,705,706],{"class":136},"        \u002F\u002F 维护堆栈（可选，ES6 后 prototype 已自动关联）\n",[67,708,709,712,714,716,718,721,723],{"class":69,"line":336},[67,710,711],{"class":408},"        if",[67,713,440],{"class":439},[67,715,41],{"class":92},[67,717,119],{"class":109},[67,719,720],{"class":92},"captureStackTrace",[67,722,453],{"class":439},[67,724,431],{"class":109},[67,726,727,730,732,734,736,739,741,743,745],{"class":69,"line":341},[67,728,729],{"class":92},"            Error",[67,731,119],{"class":109},[67,733,720],{"class":88},[67,735,93],{"class":439},[67,737,738],{"class":314},"this",[67,740,642],{"class":109},[67,742,622],{"class":92},[67,744,106],{"class":439},[67,746,110],{"class":109},[67,748,749],{"class":69,"line":347},[67,750,751],{"class":109},"        }\n",[67,753,754],{"class":69,"line":369},[67,755,556],{"class":109},[67,757,758],{"class":69,"line":374},[67,759,561],{"class":109},[67,761,762],{"class":69,"line":380},[67,763,296],{"emptyLinePlaceholder":295},[67,765,767,769],{"class":69,"line":766},13,[67,768,409],{"class":408},[67,770,412],{"class":109},[67,772,774,777,779,781,783,785,788,790,792,794,797,799,801],{"class":69,"line":773},14,[67,775,776],{"class":408},"    throw",[67,778,85],{"class":81},[67,780,622],{"class":88},[67,782,93],{"class":439},[67,784,97],{"class":96},[67,786,787],{"class":100},"Invalid email",[67,789,97],{"class":96},[67,791,642],{"class":109},[67,793,676],{"class":96},[67,795,796],{"class":100},"email",[67,798,97],{"class":96},[67,800,106],{"class":439},[67,802,110],{"class":109},[67,804,806,808,810,812],{"class":69,"line":805},15,[67,807,422],{"class":109},[67,809,425],{"class":408},[67,811,428],{"class":92},[67,813,431],{"class":109},[67,815,817,820,822,824,826,828,830,832,834,836],{"class":69,"line":816},16,[67,818,819],{"class":92},"    console",[67,821,119],{"class":109},[67,823,122],{"class":88},[67,825,93],{"class":439},[67,827,443],{"class":92},[67,829,119],{"class":109},[67,831,591],{"class":92},[67,833,106],{"class":439},[67,835,133],{"class":109},[67,837,838],{"class":136}," \u002F\u002F 'ValidationError'\n",[67,840,842,844,846,848,850,852,854,856,858,860],{"class":69,"line":841},17,[67,843,819],{"class":92},[67,845,119],{"class":109},[67,847,122],{"class":88},[67,849,93],{"class":439},[67,851,443],{"class":92},[67,853,119],{"class":109},[67,855,55],{"class":92},[67,857,106],{"class":439},[67,859,133],{"class":109},[67,861,862],{"class":136}," \u002F\u002F 'Invalid email'\n",[67,864,866,868,870,872,874,876,878,880,882,884],{"class":69,"line":865},18,[67,867,819],{"class":92},[67,869,119],{"class":109},[67,871,122],{"class":88},[67,873,93],{"class":439},[67,875,443],{"class":92},[67,877,119],{"class":109},[67,879,692],{"class":92},[67,881,106],{"class":439},[67,883,133],{"class":109},[67,885,886],{"class":136}," \u002F\u002F 'email'\n",[67,888,890,892,894,896,898,900,902,905,907,909],{"class":69,"line":889},19,[67,891,819],{"class":92},[67,893,119],{"class":109},[67,895,122],{"class":88},[67,897,93],{"class":439},[67,899,443],{"class":92},[67,901,119],{"class":109},[67,903,904],{"class":92},"stack",[67,906,106],{"class":439},[67,908,133],{"class":109},[67,910,179],{"class":136},[67,912,914],{"class":69,"line":913},20,[67,915,561],{"class":109},[23,917,918,922,923,925],{},[919,920,921],"strong",{},"注意","：在 TypeScript 中，自定义错误类可能会丢失 ",[27,924,397],{}," 行为，建议同时设置原型。",[32,927,929],{"id":928},"三全局错误捕获","三、全局错误捕获",[44,931,933],{"id":932},"_1-浏览器全局捕获","1. 浏览器全局捕获",[273,935,937],{"id":936},"windowonerror",[27,938,939],{},"window.onerror",[23,941,942,943,946],{},"捕获大多数同步错误和运行时错误（不能捕获 ",[27,944,945],{},"unhandledrejection"," 和资源加载错误）。",[58,948,950],{"className":60,"code":949,"language":62,"meta":63,"style":63},"window.onerror = function (message, source, lineno, colno, error) {\n    console.log(\"捕获到错误：\", message, source, lineno, colno, error);\n    \u002F\u002F 返回 true 可以阻止默认控制台输出\n    return true;\n};\n",[27,951,952,995,1037,1042,1053],{"__ignoreMap":63},[67,953,954,957,959,962,964,967,969,971,973,976,978,981,983,986,988,991,993],{"class":69,"line":70},[67,955,956],{"class":92},"window",[67,958,119],{"class":109},[67,960,961],{"class":88},"onerror",[67,963,82],{"class":81},[67,965,966],{"class":73}," function",[67,968,440],{"class":109},[67,970,55],{"class":639},[67,972,642],{"class":109},[67,974,975],{"class":639}," source",[67,977,642],{"class":109},[67,979,980],{"class":639}," lineno",[67,982,642],{"class":109},[67,984,985],{"class":639}," colno",[67,987,642],{"class":109},[67,989,990],{"class":639}," error",[67,992,106],{"class":109},[67,994,412],{"class":109},[67,996,997,999,1001,1003,1005,1007,1010,1012,1014,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035],{"class":69,"line":113},[67,998,819],{"class":92},[67,1000,119],{"class":109},[67,1002,122],{"class":88},[67,1004,93],{"class":439},[67,1006,97],{"class":96},[67,1008,1009],{"class":100},"捕获到错误：",[67,1011,97],{"class":96},[67,1013,642],{"class":109},[67,1015,1016],{"class":92}," message",[67,1018,642],{"class":109},[67,1020,975],{"class":92},[67,1022,642],{"class":109},[67,1024,980],{"class":92},[67,1026,642],{"class":109},[67,1028,985],{"class":92},[67,1030,642],{"class":109},[67,1032,990],{"class":92},[67,1034,106],{"class":439},[67,1036,110],{"class":109},[67,1038,1039],{"class":69,"line":140},[67,1040,1041],{"class":136},"    \u002F\u002F 返回 true 可以阻止默认控制台输出\n",[67,1043,1044,1047,1051],{"class":69,"line":161},[67,1045,1046],{"class":408},"    return",[67,1048,1050],{"class":1049},"syTEX"," true",[67,1052,110],{"class":109},[67,1054,1055],{"class":69,"line":304},[67,1056,1057],{"class":109},"};\n",[273,1059,1061],{"id":1060},"windowaddeventlistenererror",[27,1062,1063],{},"window.addEventListener('error')",[23,1065,1066,1067,605,1070,1073],{},"可以捕获资源加载错误（如 ",[27,1068,1069],{},"\u003Cimg>",[27,1071,1072],{},"\u003Cscript>"," 加载失败）。",[58,1075,1077],{"className":60,"code":1076,"language":62,"meta":63,"style":63},"window.addEventListener(\n    \"error\",\n    event => {\n        if (event.target.tagName) {\n            \u002F\u002F 资源加载错误\n            console.log(\"资源加载失败：\", event.target.src);\n        } else {\n            \u002F\u002F JS 运行时错误\n            console.log(\"JS 错误：\", event.message);\n        }\n    },\n    true\n); \u002F\u002F 使用捕获阶段\n",[27,1078,1079,1091,1103,1113,1136,1141,1177,1186,1191,1220,1224,1229,1234],{"__ignoreMap":63},[67,1080,1081,1083,1085,1088],{"class":69,"line":70},[67,1082,956],{"class":92},[67,1084,119],{"class":109},[67,1086,1087],{"class":88},"addEventListener",[67,1089,1090],{"class":92},"(\n",[67,1092,1093,1096,1098,1100],{"class":69,"line":113},[67,1094,1095],{"class":96},"    \"",[67,1097,13],{"class":100},[67,1099,97],{"class":96},[67,1101,1102],{"class":109},",\n",[67,1104,1105,1108,1111],{"class":69,"line":140},[67,1106,1107],{"class":639},"    event",[67,1109,1110],{"class":73}," =>",[67,1112,412],{"class":109},[67,1114,1115,1117,1119,1122,1124,1127,1129,1132,1134],{"class":69,"line":161},[67,1116,711],{"class":408},[67,1118,440],{"class":439},[67,1120,1121],{"class":92},"event",[67,1123,119],{"class":109},[67,1125,1126],{"class":92},"target",[67,1128,119],{"class":109},[67,1130,1131],{"class":92},"tagName",[67,1133,453],{"class":439},[67,1135,431],{"class":109},[67,1137,1138],{"class":69,"line":304},[67,1139,1140],{"class":136},"            \u002F\u002F 资源加载错误\n",[67,1142,1143,1146,1148,1150,1152,1154,1157,1159,1161,1164,1166,1168,1170,1173,1175],{"class":69,"line":320},[67,1144,1145],{"class":92},"            console",[67,1147,119],{"class":109},[67,1149,122],{"class":88},[67,1151,93],{"class":439},[67,1153,97],{"class":96},[67,1155,1156],{"class":100},"资源加载失败：",[67,1158,97],{"class":96},[67,1160,642],{"class":109},[67,1162,1163],{"class":92}," event",[67,1165,119],{"class":109},[67,1167,1126],{"class":92},[67,1169,119],{"class":109},[67,1171,1172],{"class":92},"src",[67,1174,106],{"class":439},[67,1176,110],{"class":109},[67,1178,1179,1182,1184],{"class":69,"line":336},[67,1180,1181],{"class":109},"        }",[67,1183,485],{"class":408},[67,1185,412],{"class":109},[67,1187,1188],{"class":69,"line":341},[67,1189,1190],{"class":136},"            \u002F\u002F JS 运行时错误\n",[67,1192,1193,1195,1197,1199,1201,1203,1206,1208,1210,1212,1214,1216,1218],{"class":69,"line":347},[67,1194,1145],{"class":92},[67,1196,119],{"class":109},[67,1198,122],{"class":88},[67,1200,93],{"class":439},[67,1202,97],{"class":96},[67,1204,1205],{"class":100},"JS 错误：",[67,1207,97],{"class":96},[67,1209,642],{"class":109},[67,1211,1163],{"class":92},[67,1213,119],{"class":109},[67,1215,55],{"class":92},[67,1217,106],{"class":439},[67,1219,110],{"class":109},[67,1221,1222],{"class":69,"line":369},[67,1223,751],{"class":109},[67,1225,1226],{"class":69,"line":374},[67,1227,1228],{"class":109},"    },\n",[67,1230,1231],{"class":69,"line":380},[67,1232,1233],{"class":1049},"    true\n",[67,1235,1236,1238,1240],{"class":69,"line":766},[67,1237,106],{"class":92},[67,1239,133],{"class":109},[67,1241,1242],{"class":136}," \u002F\u002F 使用捕获阶段\n",[273,1244,1245],{"id":945},[27,1246,945],{},[23,1248,1249],{},"捕获未处理的 Promise rejection。",[58,1251,1253],{"className":60,"code":1252,"language":62,"meta":63,"style":63},"window.addEventListener(\"unhandledrejection\", event => {\n    console.log(\"未处理的 Promise 拒绝：\", event.reason);\n    event.preventDefault(); \u002F\u002F 可选：阻止控制台默认输出\n});\n",[27,1254,1255,1279,1309,1325],{"__ignoreMap":63},[67,1256,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277],{"class":69,"line":70},[67,1258,956],{"class":92},[67,1260,119],{"class":109},[67,1262,1087],{"class":88},[67,1264,93],{"class":92},[67,1266,97],{"class":96},[67,1268,945],{"class":100},[67,1270,97],{"class":96},[67,1272,642],{"class":109},[67,1274,1163],{"class":639},[67,1276,1110],{"class":73},[67,1278,412],{"class":109},[67,1280,1281,1283,1285,1287,1289,1291,1294,1296,1298,1300,1302,1305,1307],{"class":69,"line":113},[67,1282,819],{"class":92},[67,1284,119],{"class":109},[67,1286,122],{"class":88},[67,1288,93],{"class":439},[67,1290,97],{"class":96},[67,1292,1293],{"class":100},"未处理的 Promise 拒绝：",[67,1295,97],{"class":96},[67,1297,642],{"class":109},[67,1299,1163],{"class":92},[67,1301,119],{"class":109},[67,1303,1304],{"class":92},"reason",[67,1306,106],{"class":439},[67,1308,110],{"class":109},[67,1310,1311,1313,1315,1318,1320,1322],{"class":69,"line":140},[67,1312,1107],{"class":92},[67,1314,119],{"class":109},[67,1316,1317],{"class":88},"preventDefault",[67,1319,331],{"class":439},[67,1321,133],{"class":109},[67,1323,1324],{"class":136}," \u002F\u002F 可选：阻止控制台默认输出\n",[67,1326,1327,1329,1331],{"class":69,"line":161},[67,1328,422],{"class":109},[67,1330,106],{"class":92},[67,1332,110],{"class":109},[44,1334,1336],{"id":1335},"_2-nodejs-全局捕获","2. Node.js 全局捕获",[273,1338,1340],{"id":1339},"processonuncaughtexception",[27,1341,1342],{},"process.on('uncaughtException')",[23,1344,1345],{},"捕获未捕获的同步异常（不推荐作为生产环境的常规恢复手段，因为程序状态可能不一致）。",[58,1347,1349],{"className":60,"code":1348,"language":62,"meta":63,"style":63},"process.on(\"uncaughtException\", err => {\n    console.error(\"未捕获异常：\", err);\n    \u002F\u002F 最佳实践：记录日志后优雅退出\n    process.exit(1);\n});\n",[27,1350,1351,1378,1403,1408,1426],{"__ignoreMap":63},[67,1352,1353,1356,1358,1361,1363,1365,1368,1370,1372,1374,1376],{"class":69,"line":70},[67,1354,1355],{"class":92},"process",[67,1357,119],{"class":109},[67,1359,1360],{"class":88},"on",[67,1362,93],{"class":92},[67,1364,97],{"class":96},[67,1366,1367],{"class":100},"uncaughtException",[67,1369,97],{"class":96},[67,1371,642],{"class":109},[67,1373,78],{"class":639},[67,1375,1110],{"class":73},[67,1377,412],{"class":109},[67,1379,1380,1382,1384,1386,1388,1390,1393,1395,1397,1399,1401],{"class":69,"line":113},[67,1381,819],{"class":92},[67,1383,119],{"class":109},[67,1385,13],{"class":88},[67,1387,93],{"class":439},[67,1389,97],{"class":96},[67,1391,1392],{"class":100},"未捕获异常：",[67,1394,97],{"class":96},[67,1396,642],{"class":109},[67,1398,78],{"class":92},[67,1400,106],{"class":439},[67,1402,110],{"class":109},[67,1404,1405],{"class":69,"line":140},[67,1406,1407],{"class":136},"    \u002F\u002F 最佳实践：记录日志后优雅退出\n",[67,1409,1410,1413,1415,1418,1420,1422,1424],{"class":69,"line":161},[67,1411,1412],{"class":92},"    process",[67,1414,119],{"class":109},[67,1416,1417],{"class":88},"exit",[67,1419,93],{"class":439},[67,1421,362],{"class":361},[67,1423,106],{"class":439},[67,1425,110],{"class":109},[67,1427,1428,1430,1432],{"class":69,"line":304},[67,1429,422],{"class":109},[67,1431,106],{"class":92},[67,1433,110],{"class":109},[273,1435,1437],{"id":1436},"processonunhandledrejection",[27,1438,1439],{},"process.on('unhandledRejection')",[23,1441,1249],{},[58,1443,1445],{"className":60,"code":1444,"language":62,"meta":63,"style":63},"process.on(\"unhandledRejection\", (reason, promise) => {\n    console.error(\"未处理的拒绝：\", reason);\n});\n",[27,1446,1447,1481,1507],{"__ignoreMap":63},[67,1448,1449,1451,1453,1455,1457,1459,1462,1464,1466,1468,1470,1472,1475,1477,1479],{"class":69,"line":70},[67,1450,1355],{"class":92},[67,1452,119],{"class":109},[67,1454,1360],{"class":88},[67,1456,93],{"class":92},[67,1458,97],{"class":96},[67,1460,1461],{"class":100},"unhandledRejection",[67,1463,97],{"class":96},[67,1465,642],{"class":109},[67,1467,440],{"class":109},[67,1469,1304],{"class":639},[67,1471,642],{"class":109},[67,1473,1474],{"class":639}," promise",[67,1476,106],{"class":109},[67,1478,1110],{"class":73},[67,1480,412],{"class":109},[67,1482,1483,1485,1487,1489,1491,1493,1496,1498,1500,1503,1505],{"class":69,"line":113},[67,1484,819],{"class":92},[67,1486,119],{"class":109},[67,1488,13],{"class":88},[67,1490,93],{"class":439},[67,1492,97],{"class":96},[67,1494,1495],{"class":100},"未处理的拒绝：",[67,1497,97],{"class":96},[67,1499,642],{"class":109},[67,1501,1502],{"class":92}," reason",[67,1504,106],{"class":439},[67,1506,110],{"class":109},[67,1508,1509,1511,1513],{"class":69,"line":140},[67,1510,422],{"class":109},[67,1512,106],{"class":92},[67,1514,110],{"class":109},[32,1516,1518,1519,1522,1523],{"id":1517},"四trycatchfinally-与-throw","四、",[27,1520,1521],{},"try\u002Fcatch\u002Ffinally"," 与 ",[27,1524,1525],{},"throw",[44,1527,47,1529],{"id":1528},"_1-trycatchfinally",[27,1530,1521],{},[58,1532,1534],{"className":60,"code":1533,"language":62,"meta":63,"style":63},"try {\n    \u002F\u002F 可能抛出错误的代码\n    riskyOperation();\n} catch (err) {\n    \u002F\u002F 错误处理\n    console.error(err.message);\n} finally {\n    \u002F\u002F 无论是否发生错误都会执行（资源清理、关闭连接等）\n    cleanup();\n}\n",[27,1535,1536,1542,1547,1556,1566,1571,1591,1600,1605,1614],{"__ignoreMap":63},[67,1537,1538,1540],{"class":69,"line":70},[67,1539,409],{"class":408},[67,1541,412],{"class":109},[67,1543,1544],{"class":69,"line":113},[67,1545,1546],{"class":136},"    \u002F\u002F 可能抛出错误的代码\n",[67,1548,1549,1552,1554],{"class":69,"line":140},[67,1550,1551],{"class":88},"    riskyOperation",[67,1553,331],{"class":439},[67,1555,110],{"class":109},[67,1557,1558,1560,1562,1564],{"class":69,"line":161},[67,1559,422],{"class":109},[67,1561,425],{"class":408},[67,1563,428],{"class":92},[67,1565,431],{"class":109},[67,1567,1568],{"class":69,"line":304},[67,1569,1570],{"class":136},"    \u002F\u002F 错误处理\n",[67,1572,1573,1575,1577,1579,1581,1583,1585,1587,1589],{"class":69,"line":320},[67,1574,819],{"class":92},[67,1576,119],{"class":109},[67,1578,13],{"class":88},[67,1580,93],{"class":439},[67,1582,443],{"class":92},[67,1584,119],{"class":109},[67,1586,55],{"class":92},[67,1588,106],{"class":439},[67,1590,110],{"class":109},[67,1592,1593,1595,1598],{"class":69,"line":336},[67,1594,422],{"class":109},[67,1596,1597],{"class":408}," finally",[67,1599,412],{"class":109},[67,1601,1602],{"class":69,"line":341},[67,1603,1604],{"class":136},"    \u002F\u002F 无论是否发生错误都会执行（资源清理、关闭连接等）\n",[67,1606,1607,1610,1612],{"class":69,"line":347},[67,1608,1609],{"class":88},"    cleanup",[67,1611,331],{"class":439},[67,1613,110],{"class":109},[67,1615,1616],{"class":69,"line":369},[67,1617,561],{"class":109},[576,1619,1620,1635],{},[579,1621,1622,1625,1626,1629,1630,1625,1633,585],{},[27,1623,1624],{},"finally"," 中的 ",[27,1627,1628],{},"return"," 会覆盖 ",[27,1631,1632],{},"catch",[27,1634,1628],{},[579,1636,1637,1638,1640,1641,1643,1644,1646],{},"如果 ",[27,1639,409],{}," 中有 ",[27,1642,1628],{},"，",[27,1645,1624],{}," 依然会在返回之前执行。",[44,1648,1650,1651],{"id":1649},"_2-throw","2. ",[27,1652,1525],{},[23,1654,1655,1656,1658],{},"可以抛出任何值（字符串、数字、对象等），但最佳实践是抛出 ",[27,1657,41],{}," 实例或其子类。",[58,1660,1662],{"className":60,"code":1661,"language":62,"meta":63,"style":63},"function divide(a, b) {\n    if (b === 0) {\n        throw new Error(\"Division by zero\");\n    }\n    return a \u002F b;\n}\n",[27,1663,1664,1686,1705,1727,1731,1745],{"__ignoreMap":63},[67,1665,1666,1669,1672,1674,1677,1679,1682,1684],{"class":69,"line":70},[67,1667,1668],{"class":73},"function",[67,1670,1671],{"class":88}," divide",[67,1673,93],{"class":109},[67,1675,1676],{"class":639},"a",[67,1678,642],{"class":109},[67,1680,1681],{"class":639}," b",[67,1683,106],{"class":109},[67,1685,412],{"class":109},[67,1687,1688,1690,1692,1695,1698,1701,1703],{"class":69,"line":113},[67,1689,436],{"class":408},[67,1691,440],{"class":439},[67,1693,1694],{"class":92},"b",[67,1696,1697],{"class":81}," ===",[67,1699,1700],{"class":361}," 0",[67,1702,453],{"class":439},[67,1704,431],{"class":109},[67,1706,1707,1710,1712,1714,1716,1718,1721,1723,1725],{"class":69,"line":140},[67,1708,1709],{"class":408},"        throw",[67,1711,85],{"class":81},[67,1713,89],{"class":88},[67,1715,93],{"class":439},[67,1717,97],{"class":96},[67,1719,1720],{"class":100},"Division by zero",[67,1722,97],{"class":96},[67,1724,106],{"class":439},[67,1726,110],{"class":109},[67,1728,1729],{"class":69,"line":161},[67,1730,556],{"class":109},[67,1732,1733,1735,1738,1741,1743],{"class":69,"line":304},[67,1734,1046],{"class":408},[67,1736,1737],{"class":92}," a",[67,1739,1740],{"class":81}," \u002F",[67,1742,1681],{"class":92},[67,1744,110],{"class":109},[67,1746,1747],{"class":69,"line":320},[67,1748,561],{"class":109},[23,1750,1751,1753,1754,1756],{},[919,1752,921],{},"：在 ",[27,1755,1632],{}," 块中可以重新抛出错误，以便上层处理。",[58,1758,1760],{"className":60,"code":1759,"language":62,"meta":63,"style":63},"try {\n    \u002F\u002F ...\n} catch (err) {\n    if (err instanceof ValidationError) {\n        \u002F\u002F 处理已知错误\n    } else {\n        throw err; \u002F\u002F 向上传递未知错误\n    }\n}\n",[27,1761,1762,1768,1773,1783,1799,1804,1812,1823,1827],{"__ignoreMap":63},[67,1763,1764,1766],{"class":69,"line":70},[67,1765,409],{"class":408},[67,1767,412],{"class":109},[67,1769,1770],{"class":69,"line":113},[67,1771,1772],{"class":136},"    \u002F\u002F ...\n",[67,1774,1775,1777,1779,1781],{"class":69,"line":140},[67,1776,422],{"class":109},[67,1778,425],{"class":408},[67,1780,428],{"class":92},[67,1782,431],{"class":109},[67,1784,1785,1787,1789,1791,1793,1795,1797],{"class":69,"line":161},[67,1786,436],{"class":408},[67,1788,440],{"class":439},[67,1790,443],{"class":92},[67,1792,446],{"class":81},[67,1794,622],{"class":449},[67,1796,453],{"class":439},[67,1798,431],{"class":109},[67,1800,1801],{"class":69,"line":304},[67,1802,1803],{"class":136},"        \u002F\u002F 处理已知错误\n",[67,1805,1806,1808,1810],{"class":69,"line":320},[67,1807,482],{"class":109},[67,1809,485],{"class":408},[67,1811,412],{"class":109},[67,1813,1814,1816,1818,1820],{"class":69,"line":336},[67,1815,1709],{"class":408},[67,1817,78],{"class":92},[67,1819,133],{"class":109},[67,1821,1822],{"class":136}," \u002F\u002F 向上传递未知错误\n",[67,1824,1825],{"class":69,"line":341},[67,1826,556],{"class":109},[67,1828,1829],{"class":69,"line":347},[67,1830,561],{"class":109},[32,1832,1834],{"id":1833},"五栈追踪与断点调试","五、栈追踪与断点调试",[44,1836,1838],{"id":1837},"_1-栈追踪stack-trace","1. 栈追踪（Stack Trace）",[23,1840,1841,1842,1844],{},"错误对象的 ",[27,1843,904],{}," 属性提供了调用栈信息，便于定位问题。",[273,1846,1847],{"id":1847},"手动获取栈追踪",[58,1849,1851],{"className":60,"code":1850,"language":62,"meta":63,"style":63},"function trace() {\n    console.log(new Error().stack);\n}\ntrace();\n",[27,1852,1853,1864,1888,1892],{"__ignoreMap":63},[67,1854,1855,1857,1860,1862],{"class":69,"line":70},[67,1856,1668],{"class":73},[67,1858,1859],{"class":88}," trace",[67,1861,331],{"class":109},[67,1863,412],{"class":109},[67,1865,1866,1868,1870,1872,1874,1876,1878,1880,1882,1884,1886],{"class":69,"line":113},[67,1867,819],{"class":92},[67,1869,119],{"class":109},[67,1871,122],{"class":88},[67,1873,93],{"class":439},[67,1875,350],{"class":81},[67,1877,89],{"class":88},[67,1879,331],{"class":439},[67,1881,119],{"class":109},[67,1883,904],{"class":92},[67,1885,106],{"class":439},[67,1887,110],{"class":109},[67,1889,1890],{"class":69,"line":140},[67,1891,561],{"class":109},[67,1893,1894,1897,1899],{"class":69,"line":161},[67,1895,1896],{"class":88},"trace",[67,1898,331],{"class":92},[67,1900,110],{"class":109},[273,1902,1904,1905,1908,1909,1912],{"id":1903},"在-nodejs-中获取更详细的栈信息使用-stack-trace-limit-或-errorcapturestacktrace","在 Node.js 中获取更详细的栈信息（使用 ",[27,1906,1907],{},"--stack-trace-limit"," 或 ",[27,1910,1911],{},"Error.captureStackTrace","）",[58,1914,1916],{"className":60,"code":1915,"language":62,"meta":63,"style":63},"const err = new Error(\"custom\");\nError.captureStackTrace(err, myFunction); \u002F\u002F 排除 myFunction 自身\n",[27,1917,1918,1943],{"__ignoreMap":63},[67,1919,1920,1922,1924,1926,1928,1930,1932,1934,1937,1939,1941],{"class":69,"line":70},[67,1921,74],{"class":73},[67,1923,78],{"class":77},[67,1925,82],{"class":81},[67,1927,85],{"class":81},[67,1929,89],{"class":88},[67,1931,93],{"class":92},[67,1933,97],{"class":96},[67,1935,1936],{"class":100},"custom",[67,1938,97],{"class":96},[67,1940,106],{"class":92},[67,1942,110],{"class":109},[67,1944,1945,1947,1949,1951,1953,1955,1958,1960],{"class":69,"line":113},[67,1946,41],{"class":92},[67,1948,119],{"class":109},[67,1950,720],{"class":88},[67,1952,125],{"class":92},[67,1954,642],{"class":109},[67,1956,1957],{"class":92}," myFunction)",[67,1959,133],{"class":109},[67,1961,1962],{"class":136}," \u002F\u002F 排除 myFunction 自身\n",[44,1964,1966],{"id":1965},"_2-浏览器-devtools-调试","2. 浏览器 DevTools 调试",[576,1968,1969,1975,1981,1987,1993,1999,2005],{},[579,1970,1971,1974],{},[919,1972,1973],{},"断点","：在 Sources 面板点击行号设置，代码执行到此处暂停。",[579,1976,1977,1980],{},[919,1978,1979],{},"条件断点","：右键行号，设置条件表达式。",[579,1982,1983,1986],{},[919,1984,1985],{},"日志点","：打印日志而不暂停。",[579,1988,1989,1992],{},[919,1990,1991],{},"调用栈面板","：查看函数调用链。",[579,1994,1995,1998],{},[919,1996,1997],{},"Scope 面板","：查看当前作用域内的变量。",[579,2000,2001,2004],{},[919,2002,2003],{},"Watch 表达式","：监控特定变量变化。",[579,2006,2007,2010],{},[919,2008,2009],{},"步进控制","：Step over (F10)、Step into (F11)、Step out (Shift+F11)、Resume (F8)。",[273,2012,2013],{"id":2013},"常用技巧",[576,2015,2016],{},[579,2017,2018,2024,2025,2028],{},[919,2019,2020,2023],{},[27,2021,2022],{},"debugger"," 语句","：在代码中手动插入 ",[27,2026,2027],{},"debugger;","，当 DevTools 打开时自动断点。",[58,2030,2032],{"className":60,"code":2031,"language":62,"meta":63,"style":63},"function complexCalc(a, b) {\n    debugger; \u002F\u002F 执行到这里会暂停\n    return a + b;\n}\n",[27,2033,2034,2053,2064,2077],{"__ignoreMap":63},[67,2035,2036,2038,2041,2043,2045,2047,2049,2051],{"class":69,"line":70},[67,2037,1668],{"class":73},[67,2039,2040],{"class":88}," complexCalc",[67,2042,93],{"class":109},[67,2044,1676],{"class":639},[67,2046,642],{"class":109},[67,2048,1681],{"class":639},[67,2050,106],{"class":109},[67,2052,412],{"class":109},[67,2054,2055,2059,2061],{"class":69,"line":113},[67,2056,2058],{"class":2057},"sw1J6","    debugger",[67,2060,133],{"class":109},[67,2062,2063],{"class":136}," \u002F\u002F 执行到这里会暂停\n",[67,2065,2066,2068,2070,2073,2075],{"class":69,"line":140},[67,2067,1046],{"class":408},[67,2069,1737],{"class":92},[67,2071,2072],{"class":81}," +",[67,2074,1681],{"class":92},[67,2076,110],{"class":109},[67,2078,2079],{"class":69,"line":161},[67,2080,561],{"class":109},[576,2082,2083],{},[579,2084,2085,2088,2089,2092,2093,2096],{},[919,2086,2087],{},"异步堆栈","：Chrome 支持异步调用链追踪，可以查看 ",[27,2090,2091],{},"setTimeout","、Promise、",[27,2094,2095],{},"async\u002Fawait"," 的完整调用路径。",[44,2098,2100],{"id":2099},"_3-nodejs-调试","3. Node.js 调试",[273,2102,2104,2105,1912],{"id":2103},"命令行调试-inspect","命令行调试（",[27,2106,2107],{},"--inspect",[58,2109,2113],{"className":2110,"code":2111,"language":2112,"meta":63,"style":63},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","node --inspect-brk app.js\n","bash",[27,2114,2115],{"__ignoreMap":63},[67,2116,2117,2120,2124],{"class":69,"line":70},[67,2118,2119],{"class":449},"node",[67,2121,2123],{"class":2122},"stzsN"," --inspect-brk",[67,2125,2126],{"class":100}," app.js\n",[23,2128,2129,2130,2133],{},"然后在 Chrome 浏览器打开 ",[27,2131,2132],{},"chrome:\u002F\u002Finspect","，即可使用 DevTools 进行调试。",[273,2135,2137],{"id":2136},"vs-code-调试","VS Code 调试",[23,2139,2140,2141,2144],{},"配置 ",[27,2142,2143],{},".vscode\u002Flaunch.json"," 文件，支持断点、变量查看、调用栈等。",[273,2146,2148,2149],{"id":2147},"打印调试与-utilinspect","打印调试与 ",[27,2150,2151],{},"util.inspect",[58,2153,2155],{"className":60,"code":2154,"language":62,"meta":63,"style":63},"const util = require(\"util\");\nconsole.log(\n    util.inspect(obj, { showHidden: false, depth: null, colors: true })\n);\n",[27,2156,2157,2182,2192,2243],{"__ignoreMap":63},[67,2158,2159,2161,2164,2166,2169,2171,2173,2176,2178,2180],{"class":69,"line":70},[67,2160,74],{"class":73},[67,2162,2163],{"class":77}," util",[67,2165,82],{"class":81},[67,2167,2168],{"class":88}," require",[67,2170,93],{"class":92},[67,2172,97],{"class":96},[67,2174,2175],{"class":100},"util",[67,2177,97],{"class":96},[67,2179,106],{"class":92},[67,2181,110],{"class":109},[67,2183,2184,2186,2188,2190],{"class":69,"line":113},[67,2185,116],{"class":92},[67,2187,119],{"class":109},[67,2189,122],{"class":88},[67,2191,1090],{"class":92},[67,2193,2194,2197,2199,2202,2205,2207,2210,2213,2216,2219,2221,2224,2226,2228,2230,2233,2235,2237,2240],{"class":69,"line":140},[67,2195,2196],{"class":92},"    util",[67,2198,119],{"class":109},[67,2200,2201],{"class":88},"inspect",[67,2203,2204],{"class":92},"(obj",[67,2206,642],{"class":109},[67,2208,2209],{"class":109}," {",[67,2211,2212],{"class":439}," showHidden",[67,2214,2215],{"class":109},":",[67,2217,2218],{"class":1049}," false",[67,2220,642],{"class":109},[67,2222,2223],{"class":439}," depth",[67,2225,2215],{"class":109},[67,2227,315],{"class":314},[67,2229,642],{"class":109},[67,2231,2232],{"class":439}," colors",[67,2234,2215],{"class":109},[67,2236,1050],{"class":1049},[67,2238,2239],{"class":109}," }",[67,2241,2242],{"class":92},")\n",[67,2244,2245,2247],{"class":69,"line":161},[67,2246,106],{"class":92},[67,2248,110],{"class":109},[273,2250,2252,2253,1912],{"id":2251},"nodejs-内置调试器node-inspect","Node.js 内置调试器（",[27,2254,2255],{},"node inspect",[58,2257,2259],{"className":2110,"code":2258,"language":2112,"meta":63,"style":63},"node inspect app.js\n",[27,2260,2261],{"__ignoreMap":63},[67,2262,2263,2265,2268],{"class":69,"line":70},[67,2264,2119],{"class":449},[67,2266,2267],{"class":100}," inspect",[67,2269,2126],{"class":100},[23,2271,2272,2273,605,2276,605,2279,2282],{},"使用 ",[27,2274,2275],{},"cont",[27,2277,2278],{},"next",[27,2280,2281],{},"watch"," 等命令，但体验不如 Chrome DevTools。",[44,2284,2286],{"id":2285},"_4-高级长栈追踪long-stack-traces","4. 高级：长栈追踪（Long Stack Traces）",[23,2288,2289,2290,2293,2294,2297,2298,2301],{},"对于异步错误，传统栈可能仅显示事件循环的当前片段。可以使用第三方库（如 ",[27,2291,2292],{},"longjohn","）或 Promise 库的 ",[27,2295,2296],{},"done()"," 方法来增强，但现代 Node.js 的 ",[27,2299,2300],{},"async_hooks"," 和 Chrome 的异步栈已经部分解决此问题。",[32,2303,2304],{"id":2304},"总结",[185,2306,2307,2317],{},[188,2308,2309],{},[191,2310,2311,2314],{},[194,2312,2313],{},"方面",[194,2315,2316],{},"核心要点",[201,2318,2319,2339,2355,2370,2384,2401],{},[191,2320,2321,2326],{},[206,2322,2323],{},[919,2324,2325],{},"错误构造函数",[206,2327,2328,2330,2331,605,2333,605,2335,605,2337],{},[27,2329,41],{}," 及子类型 ",[27,2332,210],{},[27,2334,220],{},[27,2336,234],{},[27,2338,244],{},[191,2340,2341,2346],{},[206,2342,2343],{},[919,2344,2345],{},"自定义错误",[206,2347,2348,2349,2351,2352,2354],{},"继承 ",[27,2350,41],{},"，设置 ",[27,2353,591],{}," 属性，可添加额外字段",[191,2356,2357,2362],{},[206,2358,2359],{},[919,2360,2361],{},"全局捕获（浏览器）",[206,2363,2364,2366,2367,2369],{},[27,2365,939],{},"（同步错误）、",[27,2368,945],{},"（Promise 拒绝）",[191,2371,2372,2377],{},[206,2373,2374],{},[919,2375,2376],{},"全局捕获（Node.js）",[206,2378,2379,2381,2382],{},[27,2380,1367],{},"（谨慎使用）、",[27,2383,1461],{},[191,2385,2386,2392],{},[206,2387,2388],{},[919,2389,2390],{},[27,2391,1521],{},[206,2393,2394,2395,2397,2398,2400],{},"结构化异常处理，",[27,2396,1624],{}," 用于清理，",[27,2399,1525],{}," 抛出任意值（建议 Error 实例）",[191,2402,2403,2408],{},[206,2404,2405],{},[919,2406,2407],{},"调试",[206,2409,2410,2411,2413,2414],{},"栈追踪 + 浏览器 DevTools（断点、条件断点、",[27,2412,2022],{},"）+ Node.js ",[27,2415,2107],{},[23,2417,2418],{},"生产环境应记录日志并监控未捕获异常；具体工具选型因项目而异。",[32,2420,2421],{"id":2421},"参考文献",[23,2423,2424],{},"以下链接在编写时均可正常访问：",[185,2426,2427,2437],{},[188,2428,2429],{},[191,2430,2431,2434],{},[194,2432,2433],{},"资料",[194,2435,2436],{},"说明",[201,2438,2439,2452,2464,2476],{},[191,2440,2441,2449],{},[206,2442,2443],{},[1676,2444,2448],{"href":2445,"rel":2446},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FError",[2447],"nofollow","MDN：Error",[206,2450,2451],{},"错误对象",[191,2453,2454,2461],{},[206,2455,2456],{},[1676,2457,2460],{"href":2458,"rel":2459},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FStatements\u002Ftry...catch",[2447],"MDN：try...catch",[206,2462,2463],{},"异常处理",[191,2465,2466,2473],{},[206,2467,2468],{},[1676,2469,2472],{"href":2470,"rel":2471},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FAPI\u002FWindow\u002Funhandledrejection_event",[2447],"MDN：unhandledrejection",[206,2474,2475],{},"Promise 未处理拒绝",[191,2477,2478,2485],{},[206,2479,2480],{},[1676,2481,2484],{"href":2482,"rel":2483},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fprocess.html#event-uncaughtexception",[2447],"Node.js：process 事件",[206,2486,2487],{},"Node 全局错误（英文）",[2489,2490,2491],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":63,"searchDepth":113,"depth":113,"links":2493},[2494,2499,2502,2506,2513,2519,2520],{"id":34,"depth":113,"text":35,"children":2495},[2496,2498],{"id":46,"depth":140,"text":2497},"1. Error",{"id":182,"depth":140,"text":183},{"id":564,"depth":113,"text":565,"children":2500},[2501],{"id":574,"depth":140,"text":574},{"id":928,"depth":113,"text":929,"children":2503},[2504,2505],{"id":932,"depth":140,"text":933},{"id":1335,"depth":140,"text":1336},{"id":1517,"depth":113,"text":2507,"children":2508},"四、try\u002Fcatch\u002Ffinally 与 throw",[2509,2511],{"id":1528,"depth":140,"text":2510},"1. try\u002Fcatch\u002Ffinally",{"id":1649,"depth":140,"text":2512},"2. throw",{"id":1833,"depth":113,"text":1834,"children":2514},[2515,2516,2517,2518],{"id":1837,"depth":140,"text":1838},{"id":1965,"depth":140,"text":1966},{"id":2099,"depth":140,"text":2100},{"id":2285,"depth":140,"text":2286},{"id":2304,"depth":113,"text":2304},{"id":2421,"depth":113,"text":2421},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fweb\u002FJs\u002Ferror","knowledge\u002Fknowledge\u002Fbooklet\u002Fweb\u002FJs\u002Ferror.md","md",{"items":2526},[2527,2531,2535,2539,2543,2547],{"path":2528,"title":2529,"description":2530,"category":10,"score":320},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fdom-bom","浏览器相关 API","DOM 事件、存储、fetch、Worker、Observer 等由浏览器提供的 Web API（非 ECMAScript 核心）。HTML 结构见 标签。",{"path":2532,"title":2533,"description":2534,"category":10,"score":320},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fperformance","性能优化","防抖\u002F节流、渲染与内存、资源预加载及引擎行为是前端性能的主要抓手。相关 CSS 见 视觉效果、Head 资源提示。",{"path":2536,"title":2537,"description":2538,"category":10,"score":320},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fcommon","模块化与工程化","ESM、CommonJS 与打包工具（Tree Shaking、代码分割）是前端工程化的基础。入门见 JavaScript 基础 · 模块。",{"path":2540,"title":2541,"description":2542,"category":10,"score":320},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fscope","执行模型与作用域","执行上下文与词法作用域决定变量在何处可访问、闭包如何形成，以及 var \u002F let \u002F const 的差异。语言概览见 JavaScript 基础。",{"path":2544,"title":2545,"description":2546,"category":10,"score":320},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fmap-set","数据结构与集合增强","Map \u002F Set、WeakMap \u002F WeakSet、数组高阶方法、TypedArray 与 Symbol 等扩展了内置数据结构能力。见 语言基础。",{"path":2548,"title":2549,"description":2550,"category":10,"score":320},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fbasics","JavaScript 基础","JavaScript（ECMAScript）是 Web 页面与 Node.js 等运行时的脚本语言：在浏览器中操作 DOM、发起网络请求；在服务端处理 I\u002FO。语法与 HTML、CSS 配合构成前端技术栈。",{"series":2552,"title":62,"items":2553,"index":304,"prev":2595,"next":2596},"booklet\u002Fweb\u002Fjs",[2554,2558,2560,2562,2566,2568,2569,2573,2577,2579,2581,2585,2589,2593],{"path":2555,"title":2556,"date":2557,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fadvanced","函数进阶","2022-10-24",{"path":2548,"title":2549,"date":2559,"pinned":15},"2023-11-24",{"path":2536,"title":2537,"date":2561,"pinned":15},"2025-06-21",{"path":2563,"title":2564,"date":2565,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fdesign","设计模式","2021-10-05",{"path":2528,"title":2529,"date":2567,"pinned":15},"2025-07-10",{"path":7,"title":8,"date":14,"pinned":15},{"path":2570,"title":2571,"date":2572,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fevent-loop","异步编程与事件循环","2020-03-23",{"path":2574,"title":2575,"date":2576,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fexec","正则表达式","2022-05-21",{"path":2544,"title":2545,"date":2578,"pinned":15},"2024-07-10",{"path":2532,"title":2533,"date":2580,"pinned":15},"2025-07-04",{"path":2582,"title":2583,"date":2584,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fprototype","原型与面向对象","2020-04-13",{"path":2586,"title":2587,"date":2588,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fproxy","代理与反射","2022-10-23",{"path":2590,"title":2591,"date":2592,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fsafe","安全","2023-06-26",{"path":2540,"title":2541,"date":2594,"pinned":15},"2025-01-29",{"path":2528,"title":2529,"date":2567,"pinned":15},{"path":2570,"title":2571,"date":2572,"pinned":15}]