[{"data":1,"prerenderedAt":6916},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma":3,"wiki-doc-items-2023-10-05-cplusplus-jiao-xue":6531},{"id":4,"title":5,"body":6,"chapterDepth":6518,"chapterOrder":6519,"date":6520,"description":106,"docKey":6521,"docRoot":6522,"docTitle":6523,"extension":6524,"isWikiDoc":200,"isWikiIndex":6525,"meta":6526,"navigation":200,"path":6527,"seo":6528,"stem":6529,"wikiDepth":113,"__hash__":6530},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码.md","异常处理",{"type":7,"value":8,"toc":6495},"minimark",[9,12,16,20,42,45,52,55,73,78,95,100,162,167,449,454,464,467,471,476,480,492,495,499,698,702,715,717,721,726,735,739,880,884,897,899,903,912,916,1236,1240,1248,1250,1253,1260,1264,1289,1293,1419,1423,1429,1434,1439,1521,1523,1526,1529,1532,1564,1567,1579,1583,1588,1592,1812,1816,1822,1824,1827,1832,1836,2049,2053,2056,2058,2061,2066,2076,2080,2261,2265,2274,2278,2313,2315,2319,2325,2328,2374,2378,2532,2536,2544,2546,2550,2553,2558,2674,2687,2692,2859,2864,2867,2869,2872,2875,2878,2882,3093,3097,3115,3117,3120,3123,3126,3137,3140,3144,3369,3373,3387,3389,3392,3395,3398,3403,3407,3727,3731,3738,3742,3745,3747,3750,3753,3756,3760,4017,4021,4026,4031,4034,4048,4051,4053,4056,4059,4062,4067,4116,4121,4124,4201,4205,4208,4210,4214,4217,4220,4226,4229,4249,4252,4255,4259,4448,4452,4461,4465,4469,4662,4666,4672,4675,4864,4868,4877,4881,4884,4887,4915,4921,4923,4926,4929,4932,4935,4937,4953,4957,5172,5175,5178,5180,5194,5198,5347,5351,5359,5361,5365,5368,5371,5374,5390,5394,5630,5633,5636,5666,5669,5770,5774,5777,5779,5783,5789,5793,5818,5822,5916,5920,5926,5959,5962,5975,5977,5980,5983,5986,6029,6032,6068,6071,6074,6076,6079,6085,6087,6162,6165,6203,6205,6208,6211,6213,6216,6218,6236,6238,6252,6254,6258,6262,6397,6401,6408,6410,6413,6416,6461,6464,6491],[10,11,5],"h2",{"id":5},[13,14,15],"h3",{"id":15},"异常处理概述",[17,18,19],"p",{},"在 C++ 中，程序运行过程中可能会出现各种错误，例如：",[21,22,23,27,30,33,36,39],"ul",{},[24,25,26],"li",{},"文件打开失败",[24,28,29],{},"串口打开失败",[24,31,32],{},"参数不合法",[24,34,35],{},"数组越界",[24,37,38],{},"内存申请失败",[24,40,41],{},"配置文件格式错误",[17,43,44],{},"如果每个函数都只靠返回值判断错误，代码会变得比较复杂。",[17,46,47,48,51],{},"C++ 提供了 ",[49,50,5],"strong",{}," 机制，用来把“正常逻辑”和“错误处理逻辑”分开。",[17,53,54],{},"异常处理主要使用三个关键字：",[21,56,57,63,68],{},[24,58,59],{},[60,61,62],"code",{},"try",[24,64,65],{},[60,66,67],{},"catch",[24,69,70],{},[60,71,72],{},"throw",[17,74,75],{},[49,76,77],{},"作用：",[21,79,80,85,90],{},[24,81,82,84],{},[60,83,62],{},"：放置可能出现异常的代码",[24,86,87,89],{},[60,88,72],{},"：抛出异常",[24,91,92,94],{},[60,93,67],{},"：捕获异常并处理",[17,96,97],{},[49,98,99],{},"语法：",[101,102,107],"pre",{"className":103,"code":104,"language":105,"meta":106,"style":106},"language-cpp shiki shiki-themes github-light github-dark","try\n{\n    \u002F\u002F 可能出现异常的代码\n}\ncatch (异常类型 变量名)\n{\n    \u002F\u002F 异常处理代码\n}\n","cpp","",[60,108,109,118,125,132,138,146,151,157],{"__ignoreMap":106},[110,111,114],"span",{"class":112,"line":113},"line",1,[110,115,117],{"class":116},"szBVR","try\n",[110,119,121],{"class":112,"line":120},2,[110,122,124],{"class":123},"sVt8B","{\n",[110,126,128],{"class":112,"line":127},3,[110,129,131],{"class":130},"sJ8bj","    \u002F\u002F 可能出现异常的代码\n",[110,133,135],{"class":112,"line":134},4,[110,136,137],{"class":123},"}\n",[110,139,141,143],{"class":112,"line":140},5,[110,142,67],{"class":116},[110,144,145],{"class":123}," (异常类型 变量名)\n",[110,147,149],{"class":112,"line":148},6,[110,150,124],{"class":123},[110,152,154],{"class":112,"line":153},7,[110,155,156],{"class":130},"    \u002F\u002F 异常处理代码\n",[110,158,160],{"class":112,"line":159},8,[110,161,137],{"class":123},[17,163,164],{},[49,165,166],{},"示例：",[101,168,170],{"className":103,"code":169,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\nusing namespace std;\n\nint divide(int a, int b)\n{\n    if (b == 0)\n    {\n        throw \"除数不能为0\";\n    }\n\n    return a \u002F b;\n}\n\nint main()\n{\n    try\n    {\n        int ret = divide(10, 0);\n        cout \u003C\u003C \"ret = \" \u003C\u003C ret \u003C\u003C endl;\n    }\n    catch (const char* msg)\n    {\n        cout \u003C\u003C \"捕获到异常：\" \u003C\u003C msg \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,171,172,181,196,202,230,234,251,256,266,272,277,292,297,302,313,318,324,329,356,378,383,401,406,425,430,435,444],{"__ignoreMap":106},[110,173,174,177],{"class":112,"line":113},[110,175,176],{"class":116},"#include",[110,178,180],{"class":179},"sZZnC"," \u003Ciostream>\n",[110,182,183,186,189,193],{"class":112,"line":120},[110,184,185],{"class":116},"using",[110,187,188],{"class":116}," namespace",[110,190,192],{"class":191},"sScJk"," std",[110,194,195],{"class":123},";\n",[110,197,198],{"class":112,"line":127},[110,199,201],{"emptyLinePlaceholder":200},true,"\n",[110,203,204,207,210,213,215,219,222,224,227],{"class":112,"line":134},[110,205,206],{"class":116},"int",[110,208,209],{"class":191}," divide",[110,211,212],{"class":123},"(",[110,214,206],{"class":116},[110,216,218],{"class":217},"s4XuR"," a",[110,220,221],{"class":123},", ",[110,223,206],{"class":116},[110,225,226],{"class":217}," b",[110,228,229],{"class":123},")\n",[110,231,232],{"class":112,"line":140},[110,233,124],{"class":123},[110,235,236,239,242,245,249],{"class":112,"line":148},[110,237,238],{"class":116},"    if",[110,240,241],{"class":123}," (b ",[110,243,244],{"class":116},"==",[110,246,248],{"class":247},"sj4cs"," 0",[110,250,229],{"class":123},[110,252,253],{"class":112,"line":153},[110,254,255],{"class":123},"    {\n",[110,257,258,261,264],{"class":112,"line":159},[110,259,260],{"class":116},"        throw",[110,262,263],{"class":179}," \"除数不能为0\"",[110,265,195],{"class":123},[110,267,269],{"class":112,"line":268},9,[110,270,271],{"class":123},"    }\n",[110,273,275],{"class":112,"line":274},10,[110,276,201],{"emptyLinePlaceholder":200},[110,278,280,283,286,289],{"class":112,"line":279},11,[110,281,282],{"class":116},"    return",[110,284,285],{"class":123}," a ",[110,287,288],{"class":116},"\u002F",[110,290,291],{"class":123}," b;\n",[110,293,295],{"class":112,"line":294},12,[110,296,137],{"class":123},[110,298,300],{"class":112,"line":299},13,[110,301,201],{"emptyLinePlaceholder":200},[110,303,305,307,310],{"class":112,"line":304},14,[110,306,206],{"class":116},[110,308,309],{"class":191}," main",[110,311,312],{"class":123},"()\n",[110,314,316],{"class":112,"line":315},15,[110,317,124],{"class":123},[110,319,321],{"class":112,"line":320},16,[110,322,323],{"class":116},"    try\n",[110,325,327],{"class":112,"line":326},17,[110,328,255],{"class":123},[110,330,332,335,338,341,343,345,348,350,353],{"class":112,"line":331},18,[110,333,334],{"class":116},"        int",[110,336,337],{"class":123}," ret ",[110,339,340],{"class":116},"=",[110,342,209],{"class":191},[110,344,212],{"class":123},[110,346,347],{"class":247},"10",[110,349,221],{"class":123},[110,351,352],{"class":247},"0",[110,354,355],{"class":123},");\n",[110,357,359,362,365,368,371,373,375],{"class":112,"line":358},19,[110,360,361],{"class":123},"        cout ",[110,363,364],{"class":116},"\u003C\u003C",[110,366,367],{"class":179}," \"ret = \"",[110,369,370],{"class":116}," \u003C\u003C",[110,372,337],{"class":123},[110,374,364],{"class":116},[110,376,377],{"class":123}," endl;\n",[110,379,381],{"class":112,"line":380},20,[110,382,271],{"class":123},[110,384,386,389,392,395,398],{"class":112,"line":385},21,[110,387,388],{"class":116},"    catch",[110,390,391],{"class":123}," (",[110,393,394],{"class":116},"const",[110,396,397],{"class":116}," char*",[110,399,400],{"class":123}," msg)\n",[110,402,404],{"class":112,"line":403},22,[110,405,255],{"class":123},[110,407,409,411,413,416,418,421,423],{"class":112,"line":408},23,[110,410,361],{"class":123},[110,412,364],{"class":116},[110,414,415],{"class":179}," \"捕获到异常：\"",[110,417,370],{"class":116},[110,419,420],{"class":123}," msg ",[110,422,364],{"class":116},[110,424,377],{"class":123},[110,426,428],{"class":112,"line":427},24,[110,429,271],{"class":123},[110,431,433],{"class":112,"line":432},25,[110,434,201],{"emptyLinePlaceholder":200},[110,436,438,440,442],{"class":112,"line":437},26,[110,439,282],{"class":116},[110,441,248],{"class":247},[110,443,195],{"class":123},[110,445,447],{"class":112,"line":446},27,[110,448,137],{"class":123},[17,450,451],{},[49,452,453],{},"运行\u002F观察结果：",[17,455,456,457,460,461,463],{},"程序运行后，",[60,458,459],{},"divide(10, 0)"," 会抛出异常，后面的正常返回不会继续执行，程序会跳转到 ",[60,462,67],{}," 中处理异常。",[465,466],"hr",{},[13,468,470],{"id":469},"throw-抛出异常","throw 抛出异常",[17,472,473,475],{},[60,474,72],{}," 用来主动抛出异常。",[17,477,478],{},[49,479,99],{},[101,481,483],{"className":103,"code":482,"language":105,"meta":106,"style":106},"throw 异常对象;\n",[60,484,485],{"__ignoreMap":106},[110,486,487,489],{"class":112,"line":113},[110,488,72],{"class":116},[110,490,491],{"class":123}," 异常对象;\n",[17,493,494],{},"异常对象可以是普通类型，也可以是标准库异常对象。",[17,496,497],{},[49,498,166],{},[101,500,502],{"className":103,"code":501,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\nusing namespace std;\n\nvoid checkAge(int age)\n{\n    if (age \u003C 0)\n    {\n        throw \"年龄不能小于0\";\n    }\n\n    cout \u003C\u003C \"年龄为：\" \u003C\u003C age \u003C\u003C endl;\n}\n\nint main()\n{\n    try\n    {\n        checkAge(-10);\n    }\n    catch (const char* msg)\n    {\n        cout \u003C\u003C \"错误信息：\" \u003C\u003C msg \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,503,504,510,520,524,541,545,559,563,572,576,580,599,603,607,615,619,623,627,641,645,657,661,678,682,686,694],{"__ignoreMap":106},[110,505,506,508],{"class":112,"line":113},[110,507,176],{"class":116},[110,509,180],{"class":179},[110,511,512,514,516,518],{"class":112,"line":120},[110,513,185],{"class":116},[110,515,188],{"class":116},[110,517,192],{"class":191},[110,519,195],{"class":123},[110,521,522],{"class":112,"line":127},[110,523,201],{"emptyLinePlaceholder":200},[110,525,526,529,532,534,536,539],{"class":112,"line":134},[110,527,528],{"class":116},"void",[110,530,531],{"class":191}," checkAge",[110,533,212],{"class":123},[110,535,206],{"class":116},[110,537,538],{"class":217}," age",[110,540,229],{"class":123},[110,542,543],{"class":112,"line":140},[110,544,124],{"class":123},[110,546,547,549,552,555,557],{"class":112,"line":148},[110,548,238],{"class":116},[110,550,551],{"class":123}," (age ",[110,553,554],{"class":116},"\u003C",[110,556,248],{"class":247},[110,558,229],{"class":123},[110,560,561],{"class":112,"line":153},[110,562,255],{"class":123},[110,564,565,567,570],{"class":112,"line":159},[110,566,260],{"class":116},[110,568,569],{"class":179}," \"年龄不能小于0\"",[110,571,195],{"class":123},[110,573,574],{"class":112,"line":268},[110,575,271],{"class":123},[110,577,578],{"class":112,"line":274},[110,579,201],{"emptyLinePlaceholder":200},[110,581,582,585,587,590,592,595,597],{"class":112,"line":279},[110,583,584],{"class":123},"    cout ",[110,586,364],{"class":116},[110,588,589],{"class":179}," \"年龄为：\"",[110,591,370],{"class":116},[110,593,594],{"class":123}," age ",[110,596,364],{"class":116},[110,598,377],{"class":123},[110,600,601],{"class":112,"line":294},[110,602,137],{"class":123},[110,604,605],{"class":112,"line":299},[110,606,201],{"emptyLinePlaceholder":200},[110,608,609,611,613],{"class":112,"line":304},[110,610,206],{"class":116},[110,612,309],{"class":191},[110,614,312],{"class":123},[110,616,617],{"class":112,"line":315},[110,618,124],{"class":123},[110,620,621],{"class":112,"line":320},[110,622,323],{"class":116},[110,624,625],{"class":112,"line":326},[110,626,255],{"class":123},[110,628,629,632,634,637,639],{"class":112,"line":331},[110,630,631],{"class":191},"        checkAge",[110,633,212],{"class":123},[110,635,636],{"class":116},"-",[110,638,347],{"class":247},[110,640,355],{"class":123},[110,642,643],{"class":112,"line":358},[110,644,271],{"class":123},[110,646,647,649,651,653,655],{"class":112,"line":380},[110,648,388],{"class":116},[110,650,391],{"class":123},[110,652,394],{"class":116},[110,654,397],{"class":116},[110,656,400],{"class":123},[110,658,659],{"class":112,"line":385},[110,660,255],{"class":123},[110,662,663,665,667,670,672,674,676],{"class":112,"line":403},[110,664,361],{"class":123},[110,666,364],{"class":116},[110,668,669],{"class":179}," \"错误信息：\"",[110,671,370],{"class":116},[110,673,420],{"class":123},[110,675,364],{"class":116},[110,677,377],{"class":123},[110,679,680],{"class":112,"line":408},[110,681,271],{"class":123},[110,683,684],{"class":112,"line":427},[110,685,201],{"emptyLinePlaceholder":200},[110,687,688,690,692],{"class":112,"line":432},[110,689,282],{"class":116},[110,691,248],{"class":247},[110,693,195],{"class":123},[110,695,696],{"class":112,"line":437},[110,697,137],{"class":123},[17,699,700],{},[49,701,453],{},[17,703,704,705,708,709,711,712,714],{},"当 ",[60,706,707],{},"age \u003C 0"," 时，函数会通过 ",[60,710,72],{}," 抛出异常，程序跳转到 ",[60,713,67],{}," 中执行。",[465,716],{},[13,718,720],{"id":719},"catch-捕获异常","catch 捕获异常",[17,722,723,725],{},[60,724,67],{}," 用来捕获异常。",[17,727,728,729,731,732,734],{},"如果抛出的异常类型和 ",[60,730,67],{}," 中的类型一致，就会进入对应的 ",[60,733,67],{}," 代码块。",[17,736,737],{},[49,738,166],{},[101,740,742],{"className":103,"code":741,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\nusing namespace std;\n\nvoid test()\n{\n    throw 10;\n}\n\nint main()\n{\n    try\n    {\n        test();\n    }\n    catch (int e)\n    {\n        cout \u003C\u003C \"捕获到 int 类型异常：\" \u003C\u003C e \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,743,744,750,760,764,773,777,787,791,795,803,807,811,815,823,827,838,842,860,864,868,876],{"__ignoreMap":106},[110,745,746,748],{"class":112,"line":113},[110,747,176],{"class":116},[110,749,180],{"class":179},[110,751,752,754,756,758],{"class":112,"line":120},[110,753,185],{"class":116},[110,755,188],{"class":116},[110,757,192],{"class":191},[110,759,195],{"class":123},[110,761,762],{"class":112,"line":127},[110,763,201],{"emptyLinePlaceholder":200},[110,765,766,768,771],{"class":112,"line":134},[110,767,528],{"class":116},[110,769,770],{"class":191}," test",[110,772,312],{"class":123},[110,774,775],{"class":112,"line":140},[110,776,124],{"class":123},[110,778,779,782,785],{"class":112,"line":148},[110,780,781],{"class":116},"    throw",[110,783,784],{"class":247}," 10",[110,786,195],{"class":123},[110,788,789],{"class":112,"line":153},[110,790,137],{"class":123},[110,792,793],{"class":112,"line":159},[110,794,201],{"emptyLinePlaceholder":200},[110,796,797,799,801],{"class":112,"line":268},[110,798,206],{"class":116},[110,800,309],{"class":191},[110,802,312],{"class":123},[110,804,805],{"class":112,"line":274},[110,806,124],{"class":123},[110,808,809],{"class":112,"line":279},[110,810,323],{"class":116},[110,812,813],{"class":112,"line":294},[110,814,255],{"class":123},[110,816,817,820],{"class":112,"line":299},[110,818,819],{"class":191},"        test",[110,821,822],{"class":123},"();\n",[110,824,825],{"class":112,"line":304},[110,826,271],{"class":123},[110,828,829,831,833,835],{"class":112,"line":315},[110,830,388],{"class":116},[110,832,391],{"class":123},[110,834,206],{"class":116},[110,836,837],{"class":123}," e)\n",[110,839,840],{"class":112,"line":320},[110,841,255],{"class":123},[110,843,844,846,848,851,853,856,858],{"class":112,"line":326},[110,845,361],{"class":123},[110,847,364],{"class":116},[110,849,850],{"class":179}," \"捕获到 int 类型异常：\"",[110,852,370],{"class":116},[110,854,855],{"class":123}," e ",[110,857,364],{"class":116},[110,859,377],{"class":123},[110,861,862],{"class":112,"line":331},[110,863,271],{"class":123},[110,865,866],{"class":112,"line":358},[110,867,201],{"emptyLinePlaceholder":200},[110,869,870,872,874],{"class":112,"line":380},[110,871,282],{"class":116},[110,873,248],{"class":247},[110,875,195],{"class":123},[110,877,878],{"class":112,"line":385},[110,879,137],{"class":123},[17,881,882],{},[49,883,453],{},[17,885,886,889,890,892,893,896],{},[60,887,888],{},"throw 10;"," 抛出的是 ",[60,891,206],{}," 类型异常，所以会被 ",[60,894,895],{},"catch (int e)"," 捕获。",[465,898],{},[13,900,902],{"id":901},"多个-catch-捕获不同类型异常","多个 catch 捕获不同类型异常",[17,904,905,906,908,909,911],{},"一个 ",[60,907,62],{}," 后面可以跟多个 ",[60,910,67],{},"，用于处理不同类型的异常。",[17,913,914],{},[49,915,166],{},[101,917,919],{"className":103,"code":918,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\nusing namespace std;\n\nvoid test(int type)\n{\n    if (type == 1)\n    {\n        throw 10;\n    }\n    else if (type == 2)\n    {\n        throw 3.14;\n    }\n    else if (type == 3)\n    {\n        throw \"字符串异常\";\n    }\n}\n\nint main()\n{\n    try\n    {\n        test(3);\n    }\n    catch (int e)\n    {\n        cout \u003C\u003C \"捕获到 int 异常：\" \u003C\u003C e \u003C\u003C endl;\n    }\n    catch (double e)\n    {\n        cout \u003C\u003C \"捕获到 double 异常：\" \u003C\u003C e \u003C\u003C endl;\n    }\n    catch (const char* e)\n    {\n        cout \u003C\u003C \"捕获到字符串异常：\" \u003C\u003C e \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,920,921,927,937,941,956,960,974,978,986,990,1007,1011,1020,1024,1039,1043,1052,1056,1060,1064,1072,1076,1080,1084,1095,1099,1109,1113,1131,1136,1148,1153,1171,1176,1189,1194,1212,1217,1222,1231],{"__ignoreMap":106},[110,922,923,925],{"class":112,"line":113},[110,924,176],{"class":116},[110,926,180],{"class":179},[110,928,929,931,933,935],{"class":112,"line":120},[110,930,185],{"class":116},[110,932,188],{"class":116},[110,934,192],{"class":191},[110,936,195],{"class":123},[110,938,939],{"class":112,"line":127},[110,940,201],{"emptyLinePlaceholder":200},[110,942,943,945,947,949,951,954],{"class":112,"line":134},[110,944,528],{"class":116},[110,946,770],{"class":191},[110,948,212],{"class":123},[110,950,206],{"class":116},[110,952,953],{"class":217}," type",[110,955,229],{"class":123},[110,957,958],{"class":112,"line":140},[110,959,124],{"class":123},[110,961,962,964,967,969,972],{"class":112,"line":148},[110,963,238],{"class":116},[110,965,966],{"class":123}," (type ",[110,968,244],{"class":116},[110,970,971],{"class":247}," 1",[110,973,229],{"class":123},[110,975,976],{"class":112,"line":153},[110,977,255],{"class":123},[110,979,980,982,984],{"class":112,"line":159},[110,981,260],{"class":116},[110,983,784],{"class":247},[110,985,195],{"class":123},[110,987,988],{"class":112,"line":268},[110,989,271],{"class":123},[110,991,992,995,998,1000,1002,1005],{"class":112,"line":274},[110,993,994],{"class":116},"    else",[110,996,997],{"class":116}," if",[110,999,966],{"class":123},[110,1001,244],{"class":116},[110,1003,1004],{"class":247}," 2",[110,1006,229],{"class":123},[110,1008,1009],{"class":112,"line":279},[110,1010,255],{"class":123},[110,1012,1013,1015,1018],{"class":112,"line":294},[110,1014,260],{"class":116},[110,1016,1017],{"class":247}," 3.14",[110,1019,195],{"class":123},[110,1021,1022],{"class":112,"line":299},[110,1023,271],{"class":123},[110,1025,1026,1028,1030,1032,1034,1037],{"class":112,"line":304},[110,1027,994],{"class":116},[110,1029,997],{"class":116},[110,1031,966],{"class":123},[110,1033,244],{"class":116},[110,1035,1036],{"class":247}," 3",[110,1038,229],{"class":123},[110,1040,1041],{"class":112,"line":315},[110,1042,255],{"class":123},[110,1044,1045,1047,1050],{"class":112,"line":320},[110,1046,260],{"class":116},[110,1048,1049],{"class":179}," \"字符串异常\"",[110,1051,195],{"class":123},[110,1053,1054],{"class":112,"line":326},[110,1055,271],{"class":123},[110,1057,1058],{"class":112,"line":331},[110,1059,137],{"class":123},[110,1061,1062],{"class":112,"line":358},[110,1063,201],{"emptyLinePlaceholder":200},[110,1065,1066,1068,1070],{"class":112,"line":380},[110,1067,206],{"class":116},[110,1069,309],{"class":191},[110,1071,312],{"class":123},[110,1073,1074],{"class":112,"line":385},[110,1075,124],{"class":123},[110,1077,1078],{"class":112,"line":403},[110,1079,323],{"class":116},[110,1081,1082],{"class":112,"line":408},[110,1083,255],{"class":123},[110,1085,1086,1088,1090,1093],{"class":112,"line":427},[110,1087,819],{"class":191},[110,1089,212],{"class":123},[110,1091,1092],{"class":247},"3",[110,1094,355],{"class":123},[110,1096,1097],{"class":112,"line":432},[110,1098,271],{"class":123},[110,1100,1101,1103,1105,1107],{"class":112,"line":437},[110,1102,388],{"class":116},[110,1104,391],{"class":123},[110,1106,206],{"class":116},[110,1108,837],{"class":123},[110,1110,1111],{"class":112,"line":446},[110,1112,255],{"class":123},[110,1114,1116,1118,1120,1123,1125,1127,1129],{"class":112,"line":1115},28,[110,1117,361],{"class":123},[110,1119,364],{"class":116},[110,1121,1122],{"class":179}," \"捕获到 int 异常：\"",[110,1124,370],{"class":116},[110,1126,855],{"class":123},[110,1128,364],{"class":116},[110,1130,377],{"class":123},[110,1132,1134],{"class":112,"line":1133},29,[110,1135,271],{"class":123},[110,1137,1139,1141,1143,1146],{"class":112,"line":1138},30,[110,1140,388],{"class":116},[110,1142,391],{"class":123},[110,1144,1145],{"class":116},"double",[110,1147,837],{"class":123},[110,1149,1151],{"class":112,"line":1150},31,[110,1152,255],{"class":123},[110,1154,1156,1158,1160,1163,1165,1167,1169],{"class":112,"line":1155},32,[110,1157,361],{"class":123},[110,1159,364],{"class":116},[110,1161,1162],{"class":179}," \"捕获到 double 异常：\"",[110,1164,370],{"class":116},[110,1166,855],{"class":123},[110,1168,364],{"class":116},[110,1170,377],{"class":123},[110,1172,1174],{"class":112,"line":1173},33,[110,1175,271],{"class":123},[110,1177,1179,1181,1183,1185,1187],{"class":112,"line":1178},34,[110,1180,388],{"class":116},[110,1182,391],{"class":123},[110,1184,394],{"class":116},[110,1186,397],{"class":116},[110,1188,837],{"class":123},[110,1190,1192],{"class":112,"line":1191},35,[110,1193,255],{"class":123},[110,1195,1197,1199,1201,1204,1206,1208,1210],{"class":112,"line":1196},36,[110,1198,361],{"class":123},[110,1200,364],{"class":116},[110,1202,1203],{"class":179}," \"捕获到字符串异常：\"",[110,1205,370],{"class":116},[110,1207,855],{"class":123},[110,1209,364],{"class":116},[110,1211,377],{"class":123},[110,1213,1215],{"class":112,"line":1214},37,[110,1216,271],{"class":123},[110,1218,1220],{"class":112,"line":1219},38,[110,1221,201],{"emptyLinePlaceholder":200},[110,1223,1225,1227,1229],{"class":112,"line":1224},39,[110,1226,282],{"class":116},[110,1228,248],{"class":247},[110,1230,195],{"class":123},[110,1232,1234],{"class":112,"line":1233},40,[110,1235,137],{"class":123},[17,1237,1238],{},[49,1239,453],{},[17,1241,1242,1243,1245,1246,734],{},"根据 ",[60,1244,72],{}," 抛出的类型不同，会进入不同的 ",[60,1247,67],{},[465,1249],{},[13,1251,1252],{"id":1252},"捕获所有异常",[17,1254,1255,1256,1259],{},"如果不关心异常的具体类型，可以使用 ",[60,1257,1258],{},"catch (...)"," 捕获所有异常。",[17,1261,1262],{},[49,1263,99],{},[101,1265,1267],{"className":103,"code":1266,"language":105,"meta":106,"style":106},"catch (...)\n{\n    \u002F\u002F 捕获所有异常\n}\n",[60,1268,1269,1276,1280,1285],{"__ignoreMap":106},[110,1270,1271,1273],{"class":112,"line":113},[110,1272,67],{"class":116},[110,1274,1275],{"class":123}," (...)\n",[110,1277,1278],{"class":112,"line":120},[110,1279,124],{"class":123},[110,1281,1282],{"class":112,"line":127},[110,1283,1284],{"class":130},"    \u002F\u002F 捕获所有异常\n",[110,1286,1287],{"class":112,"line":134},[110,1288,137],{"class":123},[17,1290,1291],{},[49,1292,166],{},[101,1294,1296],{"className":103,"code":1295,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\nusing namespace std;\n\nvoid test()\n{\n    throw 3.14;\n}\n\nint main()\n{\n    try\n    {\n        test();\n    }\n    catch (...)\n    {\n        cout \u003C\u003C \"捕获到未知类型异常\" \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,1297,1298,1304,1314,1318,1326,1330,1338,1342,1346,1354,1358,1362,1366,1372,1376,1382,1386,1399,1403,1407,1415],{"__ignoreMap":106},[110,1299,1300,1302],{"class":112,"line":113},[110,1301,176],{"class":116},[110,1303,180],{"class":179},[110,1305,1306,1308,1310,1312],{"class":112,"line":120},[110,1307,185],{"class":116},[110,1309,188],{"class":116},[110,1311,192],{"class":191},[110,1313,195],{"class":123},[110,1315,1316],{"class":112,"line":127},[110,1317,201],{"emptyLinePlaceholder":200},[110,1319,1320,1322,1324],{"class":112,"line":134},[110,1321,528],{"class":116},[110,1323,770],{"class":191},[110,1325,312],{"class":123},[110,1327,1328],{"class":112,"line":140},[110,1329,124],{"class":123},[110,1331,1332,1334,1336],{"class":112,"line":148},[110,1333,781],{"class":116},[110,1335,1017],{"class":247},[110,1337,195],{"class":123},[110,1339,1340],{"class":112,"line":153},[110,1341,137],{"class":123},[110,1343,1344],{"class":112,"line":159},[110,1345,201],{"emptyLinePlaceholder":200},[110,1347,1348,1350,1352],{"class":112,"line":268},[110,1349,206],{"class":116},[110,1351,309],{"class":191},[110,1353,312],{"class":123},[110,1355,1356],{"class":112,"line":274},[110,1357,124],{"class":123},[110,1359,1360],{"class":112,"line":279},[110,1361,323],{"class":116},[110,1363,1364],{"class":112,"line":294},[110,1365,255],{"class":123},[110,1367,1368,1370],{"class":112,"line":299},[110,1369,819],{"class":191},[110,1371,822],{"class":123},[110,1373,1374],{"class":112,"line":304},[110,1375,271],{"class":123},[110,1377,1378,1380],{"class":112,"line":315},[110,1379,388],{"class":116},[110,1381,1275],{"class":123},[110,1383,1384],{"class":112,"line":320},[110,1385,255],{"class":123},[110,1387,1388,1390,1392,1395,1397],{"class":112,"line":326},[110,1389,361],{"class":123},[110,1391,364],{"class":116},[110,1393,1394],{"class":179}," \"捕获到未知类型异常\"",[110,1396,370],{"class":116},[110,1398,377],{"class":123},[110,1400,1401],{"class":112,"line":331},[110,1402,271],{"class":123},[110,1404,1405],{"class":112,"line":358},[110,1406,201],{"emptyLinePlaceholder":200},[110,1408,1409,1411,1413],{"class":112,"line":380},[110,1410,282],{"class":116},[110,1412,248],{"class":247},[110,1414,195],{"class":123},[110,1416,1417],{"class":112,"line":385},[110,1418,137],{"class":123},[17,1420,1421],{},[49,1422,453],{},[17,1424,1425,1426,1428],{},"无论抛出的异常是什么类型，",[60,1427,1258],{}," 都可以捕获。",[17,1430,1431],{},[49,1432,1433],{},"注意：",[17,1435,1436,1438],{},[60,1437,1258],{}," 一般放在最后。",[101,1440,1442],{"className":103,"code":1441,"language":105,"meta":106,"style":106},"try\n{\n    test();\n}\ncatch (int e)\n{\n    cout \u003C\u003C \"int异常\" \u003C\u003C endl;\n}\ncatch (...)\n{\n    cout \u003C\u003C \"其他异常\" \u003C\u003C endl;\n}\n",[60,1443,1444,1448,1452,1459,1463,1473,1477,1490,1494,1500,1504,1517],{"__ignoreMap":106},[110,1445,1446],{"class":112,"line":113},[110,1447,117],{"class":116},[110,1449,1450],{"class":112,"line":120},[110,1451,124],{"class":123},[110,1453,1454,1457],{"class":112,"line":127},[110,1455,1456],{"class":191},"    test",[110,1458,822],{"class":123},[110,1460,1461],{"class":112,"line":134},[110,1462,137],{"class":123},[110,1464,1465,1467,1469,1471],{"class":112,"line":140},[110,1466,67],{"class":116},[110,1468,391],{"class":123},[110,1470,206],{"class":116},[110,1472,837],{"class":123},[110,1474,1475],{"class":112,"line":148},[110,1476,124],{"class":123},[110,1478,1479,1481,1483,1486,1488],{"class":112,"line":153},[110,1480,584],{"class":123},[110,1482,364],{"class":116},[110,1484,1485],{"class":179}," \"int异常\"",[110,1487,370],{"class":116},[110,1489,377],{"class":123},[110,1491,1492],{"class":112,"line":159},[110,1493,137],{"class":123},[110,1495,1496,1498],{"class":112,"line":268},[110,1497,67],{"class":116},[110,1499,1275],{"class":123},[110,1501,1502],{"class":112,"line":274},[110,1503,124],{"class":123},[110,1505,1506,1508,1510,1513,1515],{"class":112,"line":279},[110,1507,584],{"class":123},[110,1509,364],{"class":116},[110,1511,1512],{"class":179}," \"其他异常\"",[110,1514,370],{"class":116},[110,1516,377],{"class":123},[110,1518,1519],{"class":112,"line":294},[110,1520,137],{"class":123},[465,1522],{},[13,1524,1525],{"id":1525},"标准异常类",[17,1527,1528],{},"在实际 C++ 工程中，不推荐随便抛出字符串，更多时候会使用标准库提供的异常类。",[17,1530,1531],{},"常用异常类：",[21,1533,1534,1539,1544,1549,1554,1559],{},[24,1535,1536],{},[60,1537,1538],{},"std::exception",[24,1540,1541],{},[60,1542,1543],{},"std::runtime_error",[24,1545,1546],{},[60,1547,1548],{},"std::logic_error",[24,1550,1551],{},[60,1552,1553],{},"std::invalid_argument",[24,1555,1556],{},[60,1557,1558],{},"std::out_of_range",[24,1560,1561],{},[60,1562,1563],{},"std::bad_alloc",[17,1565,1566],{},"使用标准异常类需要包含头文件：",[101,1568,1570],{"className":103,"code":1569,"language":105,"meta":106,"style":106},"#include \u003Cstdexcept>\n",[60,1571,1572],{"__ignoreMap":106},[110,1573,1574,1576],{"class":112,"line":113},[110,1575,176],{"class":116},[110,1577,1578],{"class":179}," \u003Cstdexcept>\n",[1580,1581,1582],"h4",{"id":1582},"runtime_error",[17,1584,1585,1587],{},[60,1586,1582],{}," 表示运行时错误，例如文件打开失败、串口打开失败、网络连接失败等。",[17,1589,1590],{},[49,1591,166],{},[101,1593,1595],{"className":103,"code":1594,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid openSerialPort(const string& device)\n{\n    if (device.empty())\n    {\n        throw runtime_error(\"串口设备名不能为空\");\n    }\n\n    cout \u003C\u003C \"打开串口：\" \u003C\u003C device \u003C\u003C endl;\n}\n\nint main()\n{\n    try\n    {\n        openSerialPort(\"\");\n    }\n    catch (const runtime_error& e)\n    {\n        cout \u003C\u003C \"运行时错误：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,1596,1597,1603,1609,1619,1623,1645,1649,1662,1666,1680,1684,1688,1706,1710,1714,1722,1726,1730,1734,1746,1750,1764,1768,1792,1796,1800,1808],{"__ignoreMap":106},[110,1598,1599,1601],{"class":112,"line":113},[110,1600,176],{"class":116},[110,1602,180],{"class":179},[110,1604,1605,1607],{"class":112,"line":120},[110,1606,176],{"class":116},[110,1608,1578],{"class":179},[110,1610,1611,1613,1615,1617],{"class":112,"line":127},[110,1612,185],{"class":116},[110,1614,188],{"class":116},[110,1616,192],{"class":191},[110,1618,195],{"class":123},[110,1620,1621],{"class":112,"line":134},[110,1622,201],{"emptyLinePlaceholder":200},[110,1624,1625,1627,1630,1632,1634,1637,1640,1643],{"class":112,"line":140},[110,1626,528],{"class":116},[110,1628,1629],{"class":191}," openSerialPort",[110,1631,212],{"class":123},[110,1633,394],{"class":116},[110,1635,1636],{"class":191}," string",[110,1638,1639],{"class":116},"&",[110,1641,1642],{"class":217}," device",[110,1644,229],{"class":123},[110,1646,1647],{"class":112,"line":148},[110,1648,124],{"class":123},[110,1650,1651,1653,1656,1659],{"class":112,"line":153},[110,1652,238],{"class":116},[110,1654,1655],{"class":123}," (device.",[110,1657,1658],{"class":191},"empty",[110,1660,1661],{"class":123},"())\n",[110,1663,1664],{"class":112,"line":159},[110,1665,255],{"class":123},[110,1667,1668,1670,1673,1675,1678],{"class":112,"line":268},[110,1669,260],{"class":116},[110,1671,1672],{"class":191}," runtime_error",[110,1674,212],{"class":123},[110,1676,1677],{"class":179},"\"串口设备名不能为空\"",[110,1679,355],{"class":123},[110,1681,1682],{"class":112,"line":274},[110,1683,271],{"class":123},[110,1685,1686],{"class":112,"line":279},[110,1687,201],{"emptyLinePlaceholder":200},[110,1689,1690,1692,1694,1697,1699,1702,1704],{"class":112,"line":294},[110,1691,584],{"class":123},[110,1693,364],{"class":116},[110,1695,1696],{"class":179}," \"打开串口：\"",[110,1698,370],{"class":116},[110,1700,1701],{"class":123}," device ",[110,1703,364],{"class":116},[110,1705,377],{"class":123},[110,1707,1708],{"class":112,"line":299},[110,1709,137],{"class":123},[110,1711,1712],{"class":112,"line":304},[110,1713,201],{"emptyLinePlaceholder":200},[110,1715,1716,1718,1720],{"class":112,"line":315},[110,1717,206],{"class":116},[110,1719,309],{"class":191},[110,1721,312],{"class":123},[110,1723,1724],{"class":112,"line":320},[110,1725,124],{"class":123},[110,1727,1728],{"class":112,"line":326},[110,1729,323],{"class":116},[110,1731,1732],{"class":112,"line":331},[110,1733,255],{"class":123},[110,1735,1736,1739,1741,1744],{"class":112,"line":358},[110,1737,1738],{"class":191},"        openSerialPort",[110,1740,212],{"class":123},[110,1742,1743],{"class":179},"\"\"",[110,1745,355],{"class":123},[110,1747,1748],{"class":112,"line":380},[110,1749,271],{"class":123},[110,1751,1752,1754,1756,1758,1760,1762],{"class":112,"line":385},[110,1753,388],{"class":116},[110,1755,391],{"class":123},[110,1757,394],{"class":116},[110,1759,1672],{"class":123},[110,1761,1639],{"class":116},[110,1763,837],{"class":123},[110,1765,1766],{"class":112,"line":403},[110,1767,255],{"class":123},[110,1769,1770,1772,1774,1777,1779,1782,1785,1788,1790],{"class":112,"line":408},[110,1771,361],{"class":123},[110,1773,364],{"class":116},[110,1775,1776],{"class":179}," \"运行时错误：\"",[110,1778,370],{"class":116},[110,1780,1781],{"class":123}," e.",[110,1783,1784],{"class":191},"what",[110,1786,1787],{"class":123},"() ",[110,1789,364],{"class":116},[110,1791,377],{"class":123},[110,1793,1794],{"class":112,"line":427},[110,1795,271],{"class":123},[110,1797,1798],{"class":112,"line":432},[110,1799,201],{"emptyLinePlaceholder":200},[110,1801,1802,1804,1806],{"class":112,"line":437},[110,1803,282],{"class":116},[110,1805,248],{"class":247},[110,1807,195],{"class":123},[110,1809,1810],{"class":112,"line":446},[110,1811,137],{"class":123},[17,1813,1814],{},[49,1815,453],{},[17,1817,1818,1821],{},[60,1819,1820],{},"e.what()"," 可以获取异常中的错误信息。",[465,1823],{},[1580,1825,1826],{"id":1826},"invalid_argument",[17,1828,1829,1831],{},[60,1830,1826],{}," 表示参数不合法。",[17,1833,1834],{},[49,1835,166],{},[101,1837,1839],{"className":103,"code":1838,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid setSpeed(double speed)\n{\n    if (speed \u003C 0)\n    {\n        throw invalid_argument(\"速度不能为负数\");\n    }\n\n    cout \u003C\u003C \"设置速度：\" \u003C\u003C speed \u003C\u003C endl;\n}\n\nint main()\n{\n    try\n    {\n        setSpeed(-1.5);\n    }\n    catch (const invalid_argument& e)\n    {\n        cout \u003C\u003C \"参数错误：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,1840,1841,1847,1853,1863,1867,1883,1887,1900,1904,1918,1922,1926,1944,1948,1952,1960,1964,1968,1972,1986,1990,2004,2008,2029,2033,2037,2045],{"__ignoreMap":106},[110,1842,1843,1845],{"class":112,"line":113},[110,1844,176],{"class":116},[110,1846,180],{"class":179},[110,1848,1849,1851],{"class":112,"line":120},[110,1850,176],{"class":116},[110,1852,1578],{"class":179},[110,1854,1855,1857,1859,1861],{"class":112,"line":127},[110,1856,185],{"class":116},[110,1858,188],{"class":116},[110,1860,192],{"class":191},[110,1862,195],{"class":123},[110,1864,1865],{"class":112,"line":134},[110,1866,201],{"emptyLinePlaceholder":200},[110,1868,1869,1871,1874,1876,1878,1881],{"class":112,"line":140},[110,1870,528],{"class":116},[110,1872,1873],{"class":191}," setSpeed",[110,1875,212],{"class":123},[110,1877,1145],{"class":116},[110,1879,1880],{"class":217}," speed",[110,1882,229],{"class":123},[110,1884,1885],{"class":112,"line":148},[110,1886,124],{"class":123},[110,1888,1889,1891,1894,1896,1898],{"class":112,"line":153},[110,1890,238],{"class":116},[110,1892,1893],{"class":123}," (speed ",[110,1895,554],{"class":116},[110,1897,248],{"class":247},[110,1899,229],{"class":123},[110,1901,1902],{"class":112,"line":159},[110,1903,255],{"class":123},[110,1905,1906,1908,1911,1913,1916],{"class":112,"line":268},[110,1907,260],{"class":116},[110,1909,1910],{"class":191}," invalid_argument",[110,1912,212],{"class":123},[110,1914,1915],{"class":179},"\"速度不能为负数\"",[110,1917,355],{"class":123},[110,1919,1920],{"class":112,"line":274},[110,1921,271],{"class":123},[110,1923,1924],{"class":112,"line":279},[110,1925,201],{"emptyLinePlaceholder":200},[110,1927,1928,1930,1932,1935,1937,1940,1942],{"class":112,"line":294},[110,1929,584],{"class":123},[110,1931,364],{"class":116},[110,1933,1934],{"class":179}," \"设置速度：\"",[110,1936,370],{"class":116},[110,1938,1939],{"class":123}," speed ",[110,1941,364],{"class":116},[110,1943,377],{"class":123},[110,1945,1946],{"class":112,"line":299},[110,1947,137],{"class":123},[110,1949,1950],{"class":112,"line":304},[110,1951,201],{"emptyLinePlaceholder":200},[110,1953,1954,1956,1958],{"class":112,"line":315},[110,1955,206],{"class":116},[110,1957,309],{"class":191},[110,1959,312],{"class":123},[110,1961,1962],{"class":112,"line":320},[110,1963,124],{"class":123},[110,1965,1966],{"class":112,"line":326},[110,1967,323],{"class":116},[110,1969,1970],{"class":112,"line":331},[110,1971,255],{"class":123},[110,1973,1974,1977,1979,1981,1984],{"class":112,"line":358},[110,1975,1976],{"class":191},"        setSpeed",[110,1978,212],{"class":123},[110,1980,636],{"class":116},[110,1982,1983],{"class":247},"1.5",[110,1985,355],{"class":123},[110,1987,1988],{"class":112,"line":380},[110,1989,271],{"class":123},[110,1991,1992,1994,1996,1998,2000,2002],{"class":112,"line":385},[110,1993,388],{"class":116},[110,1995,391],{"class":123},[110,1997,394],{"class":116},[110,1999,1910],{"class":123},[110,2001,1639],{"class":116},[110,2003,837],{"class":123},[110,2005,2006],{"class":112,"line":403},[110,2007,255],{"class":123},[110,2009,2010,2012,2014,2017,2019,2021,2023,2025,2027],{"class":112,"line":408},[110,2011,361],{"class":123},[110,2013,364],{"class":116},[110,2015,2016],{"class":179}," \"参数错误：\"",[110,2018,370],{"class":116},[110,2020,1781],{"class":123},[110,2022,1784],{"class":191},[110,2024,1787],{"class":123},[110,2026,364],{"class":116},[110,2028,377],{"class":123},[110,2030,2031],{"class":112,"line":427},[110,2032,271],{"class":123},[110,2034,2035],{"class":112,"line":432},[110,2036,201],{"emptyLinePlaceholder":200},[110,2038,2039,2041,2043],{"class":112,"line":437},[110,2040,282],{"class":116},[110,2042,248],{"class":247},[110,2044,195],{"class":123},[110,2046,2047],{"class":112,"line":446},[110,2048,137],{"class":123},[17,2050,2051],{},[49,2052,453],{},[17,2054,2055],{},"当传入的速度小于 0 时，会抛出参数错误异常。",[465,2057],{},[1580,2059,2060],{"id":2060},"out_of_range",[17,2062,2063,2065],{},[60,2064,2060],{}," 表示访问越界。",[17,2067,2068,2071,2072,2075],{},[60,2069,2070],{},"vector"," 的 ",[60,2073,2074],{},"at()"," 函数在越界时会抛出异常。",[17,2077,2078],{},[49,2079,166],{},[101,2081,2083],{"className":103,"code":2082,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cvector>\n#include \u003Cstdexcept>\nusing namespace std;\n\nint main()\n{\n    vector\u003Cint> nums = {10, 20, 30};\n\n    try\n    {\n        cout \u003C\u003C nums.at(5) \u003C\u003C endl;\n    }\n    catch (const out_of_range& e)\n    {\n        cout \u003C\u003C \"访问越界：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,2084,2085,2091,2098,2104,2114,2118,2126,2130,2161,2165,2169,2173,2197,2201,2216,2220,2241,2245,2249,2257],{"__ignoreMap":106},[110,2086,2087,2089],{"class":112,"line":113},[110,2088,176],{"class":116},[110,2090,180],{"class":179},[110,2092,2093,2095],{"class":112,"line":120},[110,2094,176],{"class":116},[110,2096,2097],{"class":179}," \u003Cvector>\n",[110,2099,2100,2102],{"class":112,"line":127},[110,2101,176],{"class":116},[110,2103,1578],{"class":179},[110,2105,2106,2108,2110,2112],{"class":112,"line":134},[110,2107,185],{"class":116},[110,2109,188],{"class":116},[110,2111,192],{"class":191},[110,2113,195],{"class":123},[110,2115,2116],{"class":112,"line":140},[110,2117,201],{"emptyLinePlaceholder":200},[110,2119,2120,2122,2124],{"class":112,"line":148},[110,2121,206],{"class":116},[110,2123,309],{"class":191},[110,2125,312],{"class":123},[110,2127,2128],{"class":112,"line":153},[110,2129,124],{"class":123},[110,2131,2132,2135,2138,2141,2143,2146,2148,2150,2153,2155,2158],{"class":112,"line":159},[110,2133,2134],{"class":123},"    vector",[110,2136,2137],{"class":116},"\u003Cint>",[110,2139,2140],{"class":123}," nums ",[110,2142,340],{"class":116},[110,2144,2145],{"class":123}," {",[110,2147,347],{"class":247},[110,2149,221],{"class":123},[110,2151,2152],{"class":247},"20",[110,2154,221],{"class":123},[110,2156,2157],{"class":247},"30",[110,2159,2160],{"class":123},"};\n",[110,2162,2163],{"class":112,"line":268},[110,2164,201],{"emptyLinePlaceholder":200},[110,2166,2167],{"class":112,"line":274},[110,2168,323],{"class":116},[110,2170,2171],{"class":112,"line":279},[110,2172,255],{"class":123},[110,2174,2175,2177,2179,2182,2185,2187,2190,2193,2195],{"class":112,"line":294},[110,2176,361],{"class":123},[110,2178,364],{"class":116},[110,2180,2181],{"class":123}," nums.",[110,2183,2184],{"class":191},"at",[110,2186,212],{"class":123},[110,2188,2189],{"class":247},"5",[110,2191,2192],{"class":123},") ",[110,2194,364],{"class":116},[110,2196,377],{"class":123},[110,2198,2199],{"class":112,"line":299},[110,2200,271],{"class":123},[110,2202,2203,2205,2207,2209,2212,2214],{"class":112,"line":304},[110,2204,388],{"class":116},[110,2206,391],{"class":123},[110,2208,394],{"class":116},[110,2210,2211],{"class":123}," out_of_range",[110,2213,1639],{"class":116},[110,2215,837],{"class":123},[110,2217,2218],{"class":112,"line":315},[110,2219,255],{"class":123},[110,2221,2222,2224,2226,2229,2231,2233,2235,2237,2239],{"class":112,"line":320},[110,2223,361],{"class":123},[110,2225,364],{"class":116},[110,2227,2228],{"class":179}," \"访问越界：\"",[110,2230,370],{"class":116},[110,2232,1781],{"class":123},[110,2234,1784],{"class":191},[110,2236,1787],{"class":123},[110,2238,364],{"class":116},[110,2240,377],{"class":123},[110,2242,2243],{"class":112,"line":326},[110,2244,271],{"class":123},[110,2246,2247],{"class":112,"line":331},[110,2248,201],{"emptyLinePlaceholder":200},[110,2250,2251,2253,2255],{"class":112,"line":358},[110,2252,282],{"class":116},[110,2254,248],{"class":247},[110,2256,195],{"class":123},[110,2258,2259],{"class":112,"line":380},[110,2260,137],{"class":123},[17,2262,2263],{},[49,2264,453],{},[17,2266,2267,2270,2271,2273],{},[60,2268,2269],{},"nums.at(5)"," 超出了 vector 的范围，所以会抛出 ",[60,2272,2060],{}," 异常。",[17,2275,2276],{},[49,2277,1433],{},[101,2279,2281],{"className":103,"code":2280,"language":105,"meta":106,"style":106},"nums[5];     \u002F\u002F 越界时不一定抛异常，可能直接产生未定义行为\nnums.at(5); \u002F\u002F 越界时会抛出 out_of_range 异常\n",[60,2282,2283,2296],{"__ignoreMap":106},[110,2284,2285,2288,2290,2293],{"class":112,"line":113},[110,2286,2287],{"class":123},"nums[",[110,2289,2189],{"class":247},[110,2291,2292],{"class":123},"];",[110,2294,2295],{"class":130},"     \u002F\u002F 越界时不一定抛异常，可能直接产生未定义行为\n",[110,2297,2298,2301,2303,2305,2307,2310],{"class":112,"line":120},[110,2299,2300],{"class":123},"nums.",[110,2302,2184],{"class":191},[110,2304,212],{"class":123},[110,2306,2189],{"class":247},[110,2308,2309],{"class":123},");",[110,2311,2312],{"class":130}," \u002F\u002F 越界时会抛出 out_of_range 异常\n",[465,2314],{},[13,2316,2318],{"id":2317},"捕获-stdexception","捕获 std::exception",[17,2320,2321,2322,2324],{},"很多标准异常类都继承自 ",[60,2323,1538],{},"。",[17,2326,2327],{},"因此实际工程中，经常使用下面这种写法：",[101,2329,2331],{"className":103,"code":2330,"language":105,"meta":106,"style":106},"catch (const std::exception& e)\n{\n    cout \u003C\u003C e.what() \u003C\u003C endl;\n}\n",[60,2332,2333,2350,2354,2370],{"__ignoreMap":106},[110,2334,2335,2337,2339,2341,2343,2346,2348],{"class":112,"line":113},[110,2336,67],{"class":116},[110,2338,391],{"class":123},[110,2340,394],{"class":116},[110,2342,192],{"class":191},[110,2344,2345],{"class":123},"::exception",[110,2347,1639],{"class":116},[110,2349,837],{"class":123},[110,2351,2352],{"class":112,"line":120},[110,2353,124],{"class":123},[110,2355,2356,2358,2360,2362,2364,2366,2368],{"class":112,"line":127},[110,2357,584],{"class":123},[110,2359,364],{"class":116},[110,2361,1781],{"class":123},[110,2363,1784],{"class":191},[110,2365,1787],{"class":123},[110,2367,364],{"class":116},[110,2369,377],{"class":123},[110,2371,2372],{"class":112,"line":134},[110,2373,137],{"class":123},[17,2375,2376],{},[49,2377,166],{},[101,2379,2381],{"className":103,"code":2380,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid test()\n{\n    throw runtime_error(\"程序运行出现错误\");\n}\n\nint main()\n{\n    try\n    {\n        test();\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"捕获到标准异常：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,2382,2383,2389,2395,2405,2409,2417,2421,2434,2438,2442,2450,2454,2458,2462,2468,2472,2487,2491,2512,2516,2520,2528],{"__ignoreMap":106},[110,2384,2385,2387],{"class":112,"line":113},[110,2386,176],{"class":116},[110,2388,180],{"class":179},[110,2390,2391,2393],{"class":112,"line":120},[110,2392,176],{"class":116},[110,2394,1578],{"class":179},[110,2396,2397,2399,2401,2403],{"class":112,"line":127},[110,2398,185],{"class":116},[110,2400,188],{"class":116},[110,2402,192],{"class":191},[110,2404,195],{"class":123},[110,2406,2407],{"class":112,"line":134},[110,2408,201],{"emptyLinePlaceholder":200},[110,2410,2411,2413,2415],{"class":112,"line":140},[110,2412,528],{"class":116},[110,2414,770],{"class":191},[110,2416,312],{"class":123},[110,2418,2419],{"class":112,"line":148},[110,2420,124],{"class":123},[110,2422,2423,2425,2427,2429,2432],{"class":112,"line":153},[110,2424,781],{"class":116},[110,2426,1672],{"class":191},[110,2428,212],{"class":123},[110,2430,2431],{"class":179},"\"程序运行出现错误\"",[110,2433,355],{"class":123},[110,2435,2436],{"class":112,"line":159},[110,2437,137],{"class":123},[110,2439,2440],{"class":112,"line":268},[110,2441,201],{"emptyLinePlaceholder":200},[110,2443,2444,2446,2448],{"class":112,"line":274},[110,2445,206],{"class":116},[110,2447,309],{"class":191},[110,2449,312],{"class":123},[110,2451,2452],{"class":112,"line":279},[110,2453,124],{"class":123},[110,2455,2456],{"class":112,"line":294},[110,2457,323],{"class":116},[110,2459,2460],{"class":112,"line":299},[110,2461,255],{"class":123},[110,2463,2464,2466],{"class":112,"line":304},[110,2465,819],{"class":191},[110,2467,822],{"class":123},[110,2469,2470],{"class":112,"line":315},[110,2471,271],{"class":123},[110,2473,2474,2476,2478,2480,2483,2485],{"class":112,"line":320},[110,2475,388],{"class":116},[110,2477,391],{"class":123},[110,2479,394],{"class":116},[110,2481,2482],{"class":123}," exception",[110,2484,1639],{"class":116},[110,2486,837],{"class":123},[110,2488,2489],{"class":112,"line":326},[110,2490,255],{"class":123},[110,2492,2493,2495,2497,2500,2502,2504,2506,2508,2510],{"class":112,"line":331},[110,2494,361],{"class":123},[110,2496,364],{"class":116},[110,2498,2499],{"class":179}," \"捕获到标准异常：\"",[110,2501,370],{"class":116},[110,2503,1781],{"class":123},[110,2505,1784],{"class":191},[110,2507,1787],{"class":123},[110,2509,364],{"class":116},[110,2511,377],{"class":123},[110,2513,2514],{"class":112,"line":358},[110,2515,271],{"class":123},[110,2517,2518],{"class":112,"line":380},[110,2519,201],{"emptyLinePlaceholder":200},[110,2521,2522,2524,2526],{"class":112,"line":385},[110,2523,282],{"class":116},[110,2525,248],{"class":247},[110,2527,195],{"class":123},[110,2529,2530],{"class":112,"line":403},[110,2531,137],{"class":123},[17,2533,2534],{},[49,2535,453],{},[17,2537,2538,2540,2541,896],{},[60,2539,1582],{}," 属于标准异常类型，可以被 ",[60,2542,2543],{},"const exception&",[465,2545],{},[13,2547,2549],{"id":2548},"catch-捕获顺序","catch 捕获顺序",[17,2551,2552],{},"如果同时捕获父类异常和子类异常，应该先捕获子类，再捕获父类。",[17,2554,2555],{},[49,2556,2557],{},"错误写法：",[101,2559,2561],{"className":103,"code":2560,"language":105,"meta":106,"style":106},"try\n{\n    throw runtime_error(\"运行时错误\");\n}\ncatch (const exception& e)\n{\n    cout \u003C\u003C \"exception：\" \u003C\u003C e.what() \u003C\u003C endl;\n}\ncatch (const runtime_error& e)\n{\n    cout \u003C\u003C \"runtime_error：\" \u003C\u003C e.what() \u003C\u003C endl;\n}\n",[60,2562,2563,2567,2571,2584,2588,2602,2606,2627,2631,2645,2649,2670],{"__ignoreMap":106},[110,2564,2565],{"class":112,"line":113},[110,2566,117],{"class":116},[110,2568,2569],{"class":112,"line":120},[110,2570,124],{"class":123},[110,2572,2573,2575,2577,2579,2582],{"class":112,"line":127},[110,2574,781],{"class":116},[110,2576,1672],{"class":191},[110,2578,212],{"class":123},[110,2580,2581],{"class":179},"\"运行时错误\"",[110,2583,355],{"class":123},[110,2585,2586],{"class":112,"line":134},[110,2587,137],{"class":123},[110,2589,2590,2592,2594,2596,2598,2600],{"class":112,"line":140},[110,2591,67],{"class":116},[110,2593,391],{"class":123},[110,2595,394],{"class":116},[110,2597,2482],{"class":123},[110,2599,1639],{"class":116},[110,2601,837],{"class":123},[110,2603,2604],{"class":112,"line":148},[110,2605,124],{"class":123},[110,2607,2608,2610,2612,2615,2617,2619,2621,2623,2625],{"class":112,"line":153},[110,2609,584],{"class":123},[110,2611,364],{"class":116},[110,2613,2614],{"class":179}," \"exception：\"",[110,2616,370],{"class":116},[110,2618,1781],{"class":123},[110,2620,1784],{"class":191},[110,2622,1787],{"class":123},[110,2624,364],{"class":116},[110,2626,377],{"class":123},[110,2628,2629],{"class":112,"line":159},[110,2630,137],{"class":123},[110,2632,2633,2635,2637,2639,2641,2643],{"class":112,"line":268},[110,2634,67],{"class":116},[110,2636,391],{"class":123},[110,2638,394],{"class":116},[110,2640,1672],{"class":123},[110,2642,1639],{"class":116},[110,2644,837],{"class":123},[110,2646,2647],{"class":112,"line":274},[110,2648,124],{"class":123},[110,2650,2651,2653,2655,2658,2660,2662,2664,2666,2668],{"class":112,"line":279},[110,2652,584],{"class":123},[110,2654,364],{"class":116},[110,2656,2657],{"class":179}," \"runtime_error：\"",[110,2659,370],{"class":116},[110,2661,1781],{"class":123},[110,2663,1784],{"class":191},[110,2665,1787],{"class":123},[110,2667,364],{"class":116},[110,2669,377],{"class":123},[110,2671,2672],{"class":112,"line":294},[110,2673,137],{"class":123},[17,2675,2676,2677,2679,2680,2683,2684,2686],{},"上面的写法中，",[60,2678,1582],{}," 会先被 ",[60,2681,2682],{},"exception"," 捕获，后面的 ",[60,2685,1582],{}," 分支就没有意义了。",[17,2688,2689],{},[49,2690,2691],{},"推荐写法：",[101,2693,2695],{"className":103,"code":2694,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nint main()\n{\n    try\n    {\n        throw runtime_error(\"运行时错误\");\n    }\n    catch (const runtime_error& e)\n    {\n        cout \u003C\u003C \"runtime_error：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"exception：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,2696,2697,2703,2709,2719,2723,2731,2735,2739,2743,2755,2759,2773,2777,2797,2801,2815,2819,2839,2843,2847,2855],{"__ignoreMap":106},[110,2698,2699,2701],{"class":112,"line":113},[110,2700,176],{"class":116},[110,2702,180],{"class":179},[110,2704,2705,2707],{"class":112,"line":120},[110,2706,176],{"class":116},[110,2708,1578],{"class":179},[110,2710,2711,2713,2715,2717],{"class":112,"line":127},[110,2712,185],{"class":116},[110,2714,188],{"class":116},[110,2716,192],{"class":191},[110,2718,195],{"class":123},[110,2720,2721],{"class":112,"line":134},[110,2722,201],{"emptyLinePlaceholder":200},[110,2724,2725,2727,2729],{"class":112,"line":140},[110,2726,206],{"class":116},[110,2728,309],{"class":191},[110,2730,312],{"class":123},[110,2732,2733],{"class":112,"line":148},[110,2734,124],{"class":123},[110,2736,2737],{"class":112,"line":153},[110,2738,323],{"class":116},[110,2740,2741],{"class":112,"line":159},[110,2742,255],{"class":123},[110,2744,2745,2747,2749,2751,2753],{"class":112,"line":268},[110,2746,260],{"class":116},[110,2748,1672],{"class":191},[110,2750,212],{"class":123},[110,2752,2581],{"class":179},[110,2754,355],{"class":123},[110,2756,2757],{"class":112,"line":274},[110,2758,271],{"class":123},[110,2760,2761,2763,2765,2767,2769,2771],{"class":112,"line":279},[110,2762,388],{"class":116},[110,2764,391],{"class":123},[110,2766,394],{"class":116},[110,2768,1672],{"class":123},[110,2770,1639],{"class":116},[110,2772,837],{"class":123},[110,2774,2775],{"class":112,"line":294},[110,2776,255],{"class":123},[110,2778,2779,2781,2783,2785,2787,2789,2791,2793,2795],{"class":112,"line":299},[110,2780,361],{"class":123},[110,2782,364],{"class":116},[110,2784,2657],{"class":179},[110,2786,370],{"class":116},[110,2788,1781],{"class":123},[110,2790,1784],{"class":191},[110,2792,1787],{"class":123},[110,2794,364],{"class":116},[110,2796,377],{"class":123},[110,2798,2799],{"class":112,"line":304},[110,2800,271],{"class":123},[110,2802,2803,2805,2807,2809,2811,2813],{"class":112,"line":315},[110,2804,388],{"class":116},[110,2806,391],{"class":123},[110,2808,394],{"class":116},[110,2810,2482],{"class":123},[110,2812,1639],{"class":116},[110,2814,837],{"class":123},[110,2816,2817],{"class":112,"line":320},[110,2818,255],{"class":123},[110,2820,2821,2823,2825,2827,2829,2831,2833,2835,2837],{"class":112,"line":326},[110,2822,361],{"class":123},[110,2824,364],{"class":116},[110,2826,2614],{"class":179},[110,2828,370],{"class":116},[110,2830,1781],{"class":123},[110,2832,1784],{"class":191},[110,2834,1787],{"class":123},[110,2836,364],{"class":116},[110,2838,377],{"class":123},[110,2840,2841],{"class":112,"line":331},[110,2842,271],{"class":123},[110,2844,2845],{"class":112,"line":358},[110,2846,201],{"emptyLinePlaceholder":200},[110,2848,2849,2851,2853],{"class":112,"line":380},[110,2850,282],{"class":116},[110,2852,248],{"class":247},[110,2854,195],{"class":123},[110,2856,2857],{"class":112,"line":385},[110,2858,137],{"class":123},[17,2860,2861],{},[49,2862,2863],{},"总结：",[17,2865,2866],{},"子类异常写在前面，父类异常写在后面。",[465,2868],{},[13,2870,2871],{"id":2871},"异常在函数之间传递",[17,2873,2874],{},"异常可以跨函数传递。",[17,2876,2877],{},"如果当前函数没有处理异常，异常会继续向调用它的上层函数传递。",[17,2879,2880],{},[49,2881,166],{},[101,2883,2885],{"className":103,"code":2884,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid func3()\n{\n    throw runtime_error(\"func3 中出现错误\");\n}\n\nvoid func2()\n{\n    func3();\n}\n\nvoid func1()\n{\n    func2();\n}\n\nint main()\n{\n    try\n    {\n        func1();\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"main 中捕获异常：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,2886,2887,2893,2899,2909,2913,2922,2926,2939,2943,2947,2956,2960,2967,2971,2975,2984,2988,2995,2999,3003,3011,3015,3019,3023,3030,3034,3048,3052,3073,3077,3081,3089],{"__ignoreMap":106},[110,2888,2889,2891],{"class":112,"line":113},[110,2890,176],{"class":116},[110,2892,180],{"class":179},[110,2894,2895,2897],{"class":112,"line":120},[110,2896,176],{"class":116},[110,2898,1578],{"class":179},[110,2900,2901,2903,2905,2907],{"class":112,"line":127},[110,2902,185],{"class":116},[110,2904,188],{"class":116},[110,2906,192],{"class":191},[110,2908,195],{"class":123},[110,2910,2911],{"class":112,"line":134},[110,2912,201],{"emptyLinePlaceholder":200},[110,2914,2915,2917,2920],{"class":112,"line":140},[110,2916,528],{"class":116},[110,2918,2919],{"class":191}," func3",[110,2921,312],{"class":123},[110,2923,2924],{"class":112,"line":148},[110,2925,124],{"class":123},[110,2927,2928,2930,2932,2934,2937],{"class":112,"line":153},[110,2929,781],{"class":116},[110,2931,1672],{"class":191},[110,2933,212],{"class":123},[110,2935,2936],{"class":179},"\"func3 中出现错误\"",[110,2938,355],{"class":123},[110,2940,2941],{"class":112,"line":159},[110,2942,137],{"class":123},[110,2944,2945],{"class":112,"line":268},[110,2946,201],{"emptyLinePlaceholder":200},[110,2948,2949,2951,2954],{"class":112,"line":274},[110,2950,528],{"class":116},[110,2952,2953],{"class":191}," func2",[110,2955,312],{"class":123},[110,2957,2958],{"class":112,"line":279},[110,2959,124],{"class":123},[110,2961,2962,2965],{"class":112,"line":294},[110,2963,2964],{"class":191},"    func3",[110,2966,822],{"class":123},[110,2968,2969],{"class":112,"line":299},[110,2970,137],{"class":123},[110,2972,2973],{"class":112,"line":304},[110,2974,201],{"emptyLinePlaceholder":200},[110,2976,2977,2979,2982],{"class":112,"line":315},[110,2978,528],{"class":116},[110,2980,2981],{"class":191}," func1",[110,2983,312],{"class":123},[110,2985,2986],{"class":112,"line":320},[110,2987,124],{"class":123},[110,2989,2990,2993],{"class":112,"line":326},[110,2991,2992],{"class":191},"    func2",[110,2994,822],{"class":123},[110,2996,2997],{"class":112,"line":331},[110,2998,137],{"class":123},[110,3000,3001],{"class":112,"line":358},[110,3002,201],{"emptyLinePlaceholder":200},[110,3004,3005,3007,3009],{"class":112,"line":380},[110,3006,206],{"class":116},[110,3008,309],{"class":191},[110,3010,312],{"class":123},[110,3012,3013],{"class":112,"line":385},[110,3014,124],{"class":123},[110,3016,3017],{"class":112,"line":403},[110,3018,323],{"class":116},[110,3020,3021],{"class":112,"line":408},[110,3022,255],{"class":123},[110,3024,3025,3028],{"class":112,"line":427},[110,3026,3027],{"class":191},"        func1",[110,3029,822],{"class":123},[110,3031,3032],{"class":112,"line":432},[110,3033,271],{"class":123},[110,3035,3036,3038,3040,3042,3044,3046],{"class":112,"line":437},[110,3037,388],{"class":116},[110,3039,391],{"class":123},[110,3041,394],{"class":116},[110,3043,2482],{"class":123},[110,3045,1639],{"class":116},[110,3047,837],{"class":123},[110,3049,3050],{"class":112,"line":446},[110,3051,255],{"class":123},[110,3053,3054,3056,3058,3061,3063,3065,3067,3069,3071],{"class":112,"line":1115},[110,3055,361],{"class":123},[110,3057,364],{"class":116},[110,3059,3060],{"class":179}," \"main 中捕获异常：\"",[110,3062,370],{"class":116},[110,3064,1781],{"class":123},[110,3066,1784],{"class":191},[110,3068,1787],{"class":123},[110,3070,364],{"class":116},[110,3072,377],{"class":123},[110,3074,3075],{"class":112,"line":1133},[110,3076,271],{"class":123},[110,3078,3079],{"class":112,"line":1138},[110,3080,201],{"emptyLinePlaceholder":200},[110,3082,3083,3085,3087],{"class":112,"line":1150},[110,3084,282],{"class":116},[110,3086,248],{"class":247},[110,3088,195],{"class":123},[110,3090,3091],{"class":112,"line":1155},[110,3092,137],{"class":123},[17,3094,3095],{},[49,3096,453],{},[17,3098,3099,3102,3103,3106,3107,3110,3111,3114],{},[60,3100,3101],{},"func3()"," 抛出异常后，",[60,3104,3105],{},"func2()"," 和 ",[60,3108,3109],{},"func1()"," 都没有处理，最后异常传递到 ",[60,3112,3113],{},"main()"," 中被捕获。",[465,3116],{},[13,3118,3119],{"id":3119},"重新抛出异常",[17,3121,3122],{},"有时候当前函数捕获异常后，只做一部分处理，然后继续把异常交给上层处理。",[17,3124,3125],{},"可以使用：",[101,3127,3129],{"className":103,"code":3128,"language":105,"meta":106,"style":106},"throw;\n",[60,3130,3131],{"__ignoreMap":106},[110,3132,3133,3135],{"class":112,"line":113},[110,3134,72],{"class":116},[110,3136,195],{"class":123},[17,3138,3139],{},"重新抛出当前异常。",[17,3141,3142],{},[49,3143,166],{},[101,3145,3147],{"className":103,"code":3146,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid readConfig()\n{\n    try\n    {\n        throw runtime_error(\"配置文件读取失败\");\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"readConfig 中记录错误：\" \u003C\u003C e.what() \u003C\u003C endl;\n\n        \u002F\u002F 重新抛出异常\n        throw;\n    }\n}\n\nint main()\n{\n    try\n    {\n        readConfig();\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"main 中最终处理：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,3148,3149,3155,3161,3171,3175,3184,3188,3192,3196,3209,3213,3227,3231,3252,3256,3261,3267,3271,3275,3279,3287,3291,3295,3299,3306,3310,3324,3328,3349,3353,3357,3365],{"__ignoreMap":106},[110,3150,3151,3153],{"class":112,"line":113},[110,3152,176],{"class":116},[110,3154,180],{"class":179},[110,3156,3157,3159],{"class":112,"line":120},[110,3158,176],{"class":116},[110,3160,1578],{"class":179},[110,3162,3163,3165,3167,3169],{"class":112,"line":127},[110,3164,185],{"class":116},[110,3166,188],{"class":116},[110,3168,192],{"class":191},[110,3170,195],{"class":123},[110,3172,3173],{"class":112,"line":134},[110,3174,201],{"emptyLinePlaceholder":200},[110,3176,3177,3179,3182],{"class":112,"line":140},[110,3178,528],{"class":116},[110,3180,3181],{"class":191}," readConfig",[110,3183,312],{"class":123},[110,3185,3186],{"class":112,"line":148},[110,3187,124],{"class":123},[110,3189,3190],{"class":112,"line":153},[110,3191,323],{"class":116},[110,3193,3194],{"class":112,"line":159},[110,3195,255],{"class":123},[110,3197,3198,3200,3202,3204,3207],{"class":112,"line":268},[110,3199,260],{"class":116},[110,3201,1672],{"class":191},[110,3203,212],{"class":123},[110,3205,3206],{"class":179},"\"配置文件读取失败\"",[110,3208,355],{"class":123},[110,3210,3211],{"class":112,"line":274},[110,3212,271],{"class":123},[110,3214,3215,3217,3219,3221,3223,3225],{"class":112,"line":279},[110,3216,388],{"class":116},[110,3218,391],{"class":123},[110,3220,394],{"class":116},[110,3222,2482],{"class":123},[110,3224,1639],{"class":116},[110,3226,837],{"class":123},[110,3228,3229],{"class":112,"line":294},[110,3230,255],{"class":123},[110,3232,3233,3235,3237,3240,3242,3244,3246,3248,3250],{"class":112,"line":299},[110,3234,361],{"class":123},[110,3236,364],{"class":116},[110,3238,3239],{"class":179}," \"readConfig 中记录错误：\"",[110,3241,370],{"class":116},[110,3243,1781],{"class":123},[110,3245,1784],{"class":191},[110,3247,1787],{"class":123},[110,3249,364],{"class":116},[110,3251,377],{"class":123},[110,3253,3254],{"class":112,"line":304},[110,3255,201],{"emptyLinePlaceholder":200},[110,3257,3258],{"class":112,"line":315},[110,3259,3260],{"class":130},"        \u002F\u002F 重新抛出异常\n",[110,3262,3263,3265],{"class":112,"line":320},[110,3264,260],{"class":116},[110,3266,195],{"class":123},[110,3268,3269],{"class":112,"line":326},[110,3270,271],{"class":123},[110,3272,3273],{"class":112,"line":331},[110,3274,137],{"class":123},[110,3276,3277],{"class":112,"line":358},[110,3278,201],{"emptyLinePlaceholder":200},[110,3280,3281,3283,3285],{"class":112,"line":380},[110,3282,206],{"class":116},[110,3284,309],{"class":191},[110,3286,312],{"class":123},[110,3288,3289],{"class":112,"line":385},[110,3290,124],{"class":123},[110,3292,3293],{"class":112,"line":403},[110,3294,323],{"class":116},[110,3296,3297],{"class":112,"line":408},[110,3298,255],{"class":123},[110,3300,3301,3304],{"class":112,"line":427},[110,3302,3303],{"class":191},"        readConfig",[110,3305,822],{"class":123},[110,3307,3308],{"class":112,"line":432},[110,3309,271],{"class":123},[110,3311,3312,3314,3316,3318,3320,3322],{"class":112,"line":437},[110,3313,388],{"class":116},[110,3315,391],{"class":123},[110,3317,394],{"class":116},[110,3319,2482],{"class":123},[110,3321,1639],{"class":116},[110,3323,837],{"class":123},[110,3325,3326],{"class":112,"line":446},[110,3327,255],{"class":123},[110,3329,3330,3332,3334,3337,3339,3341,3343,3345,3347],{"class":112,"line":1115},[110,3331,361],{"class":123},[110,3333,364],{"class":116},[110,3335,3336],{"class":179}," \"main 中最终处理：\"",[110,3338,370],{"class":116},[110,3340,1781],{"class":123},[110,3342,1784],{"class":191},[110,3344,1787],{"class":123},[110,3346,364],{"class":116},[110,3348,377],{"class":123},[110,3350,3351],{"class":112,"line":1133},[110,3352,271],{"class":123},[110,3354,3355],{"class":112,"line":1138},[110,3356,201],{"emptyLinePlaceholder":200},[110,3358,3359,3361,3363],{"class":112,"line":1150},[110,3360,282],{"class":116},[110,3362,248],{"class":247},[110,3364,195],{"class":123},[110,3366,3367],{"class":112,"line":1155},[110,3368,137],{"class":123},[17,3370,3371],{},[49,3372,453],{},[17,3374,3375,3376,3379,3380,3383,3384,3386],{},"异常先在 ",[60,3377,3378],{},"readConfig()"," 中被捕获一次，然后通过 ",[60,3381,3382],{},"throw;"," 重新抛出，最后在 ",[60,3385,3113],{}," 中再次被捕获。",[465,3388],{},[13,3390,3391],{"id":3391},"自定义异常类",[17,3393,3394],{},"标准异常类型已经能解决大多数问题。",[17,3396,3397],{},"如果希望区分更加具体的错误，也可以自定义异常类。",[17,3399,3400,3401,2324],{},"自定义异常类通常继承自 ",[60,3402,1543],{},[17,3404,3405],{},[49,3406,166],{},[101,3408,3410],{"className":103,"code":3409,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nclass SerialException : public runtime_error\n{\npublic:\n    SerialException(const string& msg)\n        : runtime_error(msg)\n    {\n    }\n};\n\nvoid openSerial(const string& device)\n{\n    if (device.empty())\n    {\n        throw SerialException(\"串口设备名为空\");\n    }\n\n    cout \u003C\u003C \"打开串口：\" \u003C\u003C device \u003C\u003C endl;\n}\n\nint main()\n{\n    try\n    {\n        openSerial(\"\");\n    }\n    catch (const SerialException& e)\n    {\n        cout \u003C\u003C \"串口异常：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"其他异常：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,3411,3412,3418,3424,3434,3438,3455,3459,3464,3482,3492,3496,3500,3504,3508,3527,3531,3541,3545,3558,3562,3566,3582,3586,3590,3598,3602,3606,3610,3621,3625,3639,3643,3664,3668,3682,3686,3707,3711,3715,3723],{"__ignoreMap":106},[110,3413,3414,3416],{"class":112,"line":113},[110,3415,176],{"class":116},[110,3417,180],{"class":179},[110,3419,3420,3422],{"class":112,"line":120},[110,3421,176],{"class":116},[110,3423,1578],{"class":179},[110,3425,3426,3428,3430,3432],{"class":112,"line":127},[110,3427,185],{"class":116},[110,3429,188],{"class":116},[110,3431,192],{"class":191},[110,3433,195],{"class":123},[110,3435,3436],{"class":112,"line":134},[110,3437,201],{"emptyLinePlaceholder":200},[110,3439,3440,3443,3446,3449,3452],{"class":112,"line":140},[110,3441,3442],{"class":116},"class",[110,3444,3445],{"class":191}," SerialException",[110,3447,3448],{"class":123}," : ",[110,3450,3451],{"class":116},"public",[110,3453,3454],{"class":191}," runtime_error\n",[110,3456,3457],{"class":112,"line":148},[110,3458,124],{"class":123},[110,3460,3461],{"class":112,"line":153},[110,3462,3463],{"class":116},"public:\n",[110,3465,3466,3469,3471,3473,3475,3477,3480],{"class":112,"line":159},[110,3467,3468],{"class":191},"    SerialException",[110,3470,212],{"class":123},[110,3472,394],{"class":116},[110,3474,1636],{"class":191},[110,3476,1639],{"class":116},[110,3478,3479],{"class":217}," msg",[110,3481,229],{"class":123},[110,3483,3484,3487,3489],{"class":112,"line":268},[110,3485,3486],{"class":123},"        : ",[110,3488,1582],{"class":191},[110,3490,3491],{"class":123},"(msg)\n",[110,3493,3494],{"class":112,"line":274},[110,3495,255],{"class":123},[110,3497,3498],{"class":112,"line":279},[110,3499,271],{"class":123},[110,3501,3502],{"class":112,"line":294},[110,3503,2160],{"class":123},[110,3505,3506],{"class":112,"line":299},[110,3507,201],{"emptyLinePlaceholder":200},[110,3509,3510,3512,3515,3517,3519,3521,3523,3525],{"class":112,"line":304},[110,3511,528],{"class":116},[110,3513,3514],{"class":191}," openSerial",[110,3516,212],{"class":123},[110,3518,394],{"class":116},[110,3520,1636],{"class":191},[110,3522,1639],{"class":116},[110,3524,1642],{"class":217},[110,3526,229],{"class":123},[110,3528,3529],{"class":112,"line":315},[110,3530,124],{"class":123},[110,3532,3533,3535,3537,3539],{"class":112,"line":320},[110,3534,238],{"class":116},[110,3536,1655],{"class":123},[110,3538,1658],{"class":191},[110,3540,1661],{"class":123},[110,3542,3543],{"class":112,"line":326},[110,3544,255],{"class":123},[110,3546,3547,3549,3551,3553,3556],{"class":112,"line":331},[110,3548,260],{"class":116},[110,3550,3445],{"class":191},[110,3552,212],{"class":123},[110,3554,3555],{"class":179},"\"串口设备名为空\"",[110,3557,355],{"class":123},[110,3559,3560],{"class":112,"line":358},[110,3561,271],{"class":123},[110,3563,3564],{"class":112,"line":380},[110,3565,201],{"emptyLinePlaceholder":200},[110,3567,3568,3570,3572,3574,3576,3578,3580],{"class":112,"line":385},[110,3569,584],{"class":123},[110,3571,364],{"class":116},[110,3573,1696],{"class":179},[110,3575,370],{"class":116},[110,3577,1701],{"class":123},[110,3579,364],{"class":116},[110,3581,377],{"class":123},[110,3583,3584],{"class":112,"line":403},[110,3585,137],{"class":123},[110,3587,3588],{"class":112,"line":408},[110,3589,201],{"emptyLinePlaceholder":200},[110,3591,3592,3594,3596],{"class":112,"line":427},[110,3593,206],{"class":116},[110,3595,309],{"class":191},[110,3597,312],{"class":123},[110,3599,3600],{"class":112,"line":432},[110,3601,124],{"class":123},[110,3603,3604],{"class":112,"line":437},[110,3605,323],{"class":116},[110,3607,3608],{"class":112,"line":446},[110,3609,255],{"class":123},[110,3611,3612,3615,3617,3619],{"class":112,"line":1115},[110,3613,3614],{"class":191},"        openSerial",[110,3616,212],{"class":123},[110,3618,1743],{"class":179},[110,3620,355],{"class":123},[110,3622,3623],{"class":112,"line":1133},[110,3624,271],{"class":123},[110,3626,3627,3629,3631,3633,3635,3637],{"class":112,"line":1138},[110,3628,388],{"class":116},[110,3630,391],{"class":123},[110,3632,394],{"class":116},[110,3634,3445],{"class":123},[110,3636,1639],{"class":116},[110,3638,837],{"class":123},[110,3640,3641],{"class":112,"line":1150},[110,3642,255],{"class":123},[110,3644,3645,3647,3649,3652,3654,3656,3658,3660,3662],{"class":112,"line":1155},[110,3646,361],{"class":123},[110,3648,364],{"class":116},[110,3650,3651],{"class":179}," \"串口异常：\"",[110,3653,370],{"class":116},[110,3655,1781],{"class":123},[110,3657,1784],{"class":191},[110,3659,1787],{"class":123},[110,3661,364],{"class":116},[110,3663,377],{"class":123},[110,3665,3666],{"class":112,"line":1173},[110,3667,271],{"class":123},[110,3669,3670,3672,3674,3676,3678,3680],{"class":112,"line":1178},[110,3671,388],{"class":116},[110,3673,391],{"class":123},[110,3675,394],{"class":116},[110,3677,2482],{"class":123},[110,3679,1639],{"class":116},[110,3681,837],{"class":123},[110,3683,3684],{"class":112,"line":1191},[110,3685,255],{"class":123},[110,3687,3688,3690,3692,3695,3697,3699,3701,3703,3705],{"class":112,"line":1196},[110,3689,361],{"class":123},[110,3691,364],{"class":116},[110,3693,3694],{"class":179}," \"其他异常：\"",[110,3696,370],{"class":116},[110,3698,1781],{"class":123},[110,3700,1784],{"class":191},[110,3702,1787],{"class":123},[110,3704,364],{"class":116},[110,3706,377],{"class":123},[110,3708,3709],{"class":112,"line":1214},[110,3710,271],{"class":123},[110,3712,3713],{"class":112,"line":1219},[110,3714,201],{"emptyLinePlaceholder":200},[110,3716,3717,3719,3721],{"class":112,"line":1224},[110,3718,282],{"class":116},[110,3720,248],{"class":247},[110,3722,195],{"class":123},[110,3724,3725],{"class":112,"line":1233},[110,3726,137],{"class":123},[17,3728,3729],{},[49,3730,453],{},[17,3732,3733,3734,3737],{},"当串口设备名为空时，会抛出 ",[60,3735,3736],{},"SerialException"," 类型异常。",[17,3739,3740],{},[49,3741,1433],{},[17,3743,3744],{},"普通学习阶段不需要大量自定义异常类，标准异常类已经够用。",[465,3746],{},[13,3748,3749],{"id":3749},"异常与构造函数",[17,3751,3752],{},"构造函数没有返回值。",[17,3754,3755],{},"如果对象初始化失败，可以在构造函数中抛出异常。",[17,3757,3758],{},[49,3759,166],{},[101,3761,3763],{"className":103,"code":3762,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nclass SerialPort\n{\npublic:\n    SerialPort(const string& device)\n    {\n        if (device.empty())\n        {\n            throw runtime_error(\"串口初始化失败：设备名为空\");\n        }\n\n        m_Device = device;\n        cout \u003C\u003C \"串口初始化成功：\" \u003C\u003C m_Device \u003C\u003C endl;\n    }\n\nprivate:\n    string m_Device;\n};\n\nint main()\n{\n    try\n    {\n        SerialPort port(\"\");\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"创建对象失败：\" \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,3764,3765,3771,3777,3787,3791,3798,3802,3806,3823,3827,3838,3843,3857,3862,3866,3876,3894,3898,3902,3907,3912,3916,3920,3928,3932,3936,3940,3954,3958,3972,3976,3997,4001,4005,4013],{"__ignoreMap":106},[110,3766,3767,3769],{"class":112,"line":113},[110,3768,176],{"class":116},[110,3770,180],{"class":179},[110,3772,3773,3775],{"class":112,"line":120},[110,3774,176],{"class":116},[110,3776,1578],{"class":179},[110,3778,3779,3781,3783,3785],{"class":112,"line":127},[110,3780,185],{"class":116},[110,3782,188],{"class":116},[110,3784,192],{"class":191},[110,3786,195],{"class":123},[110,3788,3789],{"class":112,"line":134},[110,3790,201],{"emptyLinePlaceholder":200},[110,3792,3793,3795],{"class":112,"line":140},[110,3794,3442],{"class":116},[110,3796,3797],{"class":191}," SerialPort\n",[110,3799,3800],{"class":112,"line":148},[110,3801,124],{"class":123},[110,3803,3804],{"class":112,"line":153},[110,3805,3463],{"class":116},[110,3807,3808,3811,3813,3815,3817,3819,3821],{"class":112,"line":159},[110,3809,3810],{"class":191},"    SerialPort",[110,3812,212],{"class":123},[110,3814,394],{"class":116},[110,3816,1636],{"class":191},[110,3818,1639],{"class":116},[110,3820,1642],{"class":217},[110,3822,229],{"class":123},[110,3824,3825],{"class":112,"line":268},[110,3826,255],{"class":123},[110,3828,3829,3832,3834,3836],{"class":112,"line":274},[110,3830,3831],{"class":116},"        if",[110,3833,1655],{"class":123},[110,3835,1658],{"class":191},[110,3837,1661],{"class":123},[110,3839,3840],{"class":112,"line":279},[110,3841,3842],{"class":123},"        {\n",[110,3844,3845,3848,3850,3852,3855],{"class":112,"line":294},[110,3846,3847],{"class":116},"            throw",[110,3849,1672],{"class":191},[110,3851,212],{"class":123},[110,3853,3854],{"class":179},"\"串口初始化失败：设备名为空\"",[110,3856,355],{"class":123},[110,3858,3859],{"class":112,"line":299},[110,3860,3861],{"class":123},"        }\n",[110,3863,3864],{"class":112,"line":304},[110,3865,201],{"emptyLinePlaceholder":200},[110,3867,3868,3871,3873],{"class":112,"line":315},[110,3869,3870],{"class":123},"        m_Device ",[110,3872,340],{"class":116},[110,3874,3875],{"class":123}," device;\n",[110,3877,3878,3880,3882,3885,3887,3890,3892],{"class":112,"line":320},[110,3879,361],{"class":123},[110,3881,364],{"class":116},[110,3883,3884],{"class":179}," \"串口初始化成功：\"",[110,3886,370],{"class":116},[110,3888,3889],{"class":123}," m_Device ",[110,3891,364],{"class":116},[110,3893,377],{"class":123},[110,3895,3896],{"class":112,"line":326},[110,3897,271],{"class":123},[110,3899,3900],{"class":112,"line":331},[110,3901,201],{"emptyLinePlaceholder":200},[110,3903,3904],{"class":112,"line":358},[110,3905,3906],{"class":116},"private:\n",[110,3908,3909],{"class":112,"line":380},[110,3910,3911],{"class":123},"    string m_Device;\n",[110,3913,3914],{"class":112,"line":385},[110,3915,2160],{"class":123},[110,3917,3918],{"class":112,"line":403},[110,3919,201],{"emptyLinePlaceholder":200},[110,3921,3922,3924,3926],{"class":112,"line":408},[110,3923,206],{"class":116},[110,3925,309],{"class":191},[110,3927,312],{"class":123},[110,3929,3930],{"class":112,"line":427},[110,3931,124],{"class":123},[110,3933,3934],{"class":112,"line":432},[110,3935,323],{"class":116},[110,3937,3938],{"class":112,"line":437},[110,3939,255],{"class":123},[110,3941,3942,3945,3948,3950,3952],{"class":112,"line":446},[110,3943,3944],{"class":123},"        SerialPort ",[110,3946,3947],{"class":191},"port",[110,3949,212],{"class":123},[110,3951,1743],{"class":179},[110,3953,355],{"class":123},[110,3955,3956],{"class":112,"line":1115},[110,3957,271],{"class":123},[110,3959,3960,3962,3964,3966,3968,3970],{"class":112,"line":1133},[110,3961,388],{"class":116},[110,3963,391],{"class":123},[110,3965,394],{"class":116},[110,3967,2482],{"class":123},[110,3969,1639],{"class":116},[110,3971,837],{"class":123},[110,3973,3974],{"class":112,"line":1138},[110,3975,255],{"class":123},[110,3977,3978,3980,3982,3985,3987,3989,3991,3993,3995],{"class":112,"line":1150},[110,3979,361],{"class":123},[110,3981,364],{"class":116},[110,3983,3984],{"class":179}," \"创建对象失败：\"",[110,3986,370],{"class":116},[110,3988,1781],{"class":123},[110,3990,1784],{"class":191},[110,3992,1787],{"class":123},[110,3994,364],{"class":116},[110,3996,377],{"class":123},[110,3998,3999],{"class":112,"line":1155},[110,4000,271],{"class":123},[110,4002,4003],{"class":112,"line":1173},[110,4004,201],{"emptyLinePlaceholder":200},[110,4006,4007,4009,4011],{"class":112,"line":1178},[110,4008,282],{"class":116},[110,4010,248],{"class":247},[110,4012,195],{"class":123},[110,4014,4015],{"class":112,"line":1191},[110,4016,137],{"class":123},[17,4018,4019],{},[49,4020,453],{},[17,4022,4023,4024,463],{},"如果构造函数抛出异常，对象创建失败，程序会跳转到 ",[60,4025,67],{},[17,4027,4028],{},[49,4029,4030],{},"应用场景：",[17,4032,4033],{},"例如：",[21,4035,4036,4039,4042,4045],{},[24,4037,4038],{},"打开文件失败",[24,4040,4041],{},"打开串口失败",[24,4043,4044],{},"读取配置失败",[24,4046,4047],{},"初始化网络连接失败",[17,4049,4050],{},"这些情况可以考虑在构造函数中抛出异常。",[465,4052],{},[13,4054,4055],{"id":4055},"异常与析构函数",[17,4057,4058],{},"析构函数中一般不要抛出异常。",[17,4060,4061],{},"因为对象销毁时如果再次抛出异常，可能导致程序直接终止。",[17,4063,4064],{},[49,4065,4066],{},"错误示例：",[101,4068,4070],{"className":103,"code":4069,"language":105,"meta":106,"style":106},"class Test\n{\npublic:\n    ~Test()\n    {\n        \u002F\u002F 不推荐在析构函数中抛异常\n        \u002F\u002F throw runtime_error(\"析构失败\");\n    }\n};\n",[60,4071,4072,4079,4083,4087,4094,4098,4103,4108,4112],{"__ignoreMap":106},[110,4073,4074,4076],{"class":112,"line":113},[110,4075,3442],{"class":116},[110,4077,4078],{"class":191}," Test\n",[110,4080,4081],{"class":112,"line":120},[110,4082,124],{"class":123},[110,4084,4085],{"class":112,"line":127},[110,4086,3463],{"class":116},[110,4088,4089,4092],{"class":112,"line":134},[110,4090,4091],{"class":191},"    ~Test",[110,4093,312],{"class":123},[110,4095,4096],{"class":112,"line":140},[110,4097,255],{"class":123},[110,4099,4100],{"class":112,"line":148},[110,4101,4102],{"class":130},"        \u002F\u002F 不推荐在析构函数中抛异常\n",[110,4104,4105],{"class":112,"line":153},[110,4106,4107],{"class":130},"        \u002F\u002F throw runtime_error(\"析构失败\");\n",[110,4109,4110],{"class":112,"line":159},[110,4111,271],{"class":123},[110,4113,4114],{"class":112,"line":268},[110,4115,2160],{"class":123},[17,4117,4118],{},[49,4119,4120],{},"推荐做法：",[17,4122,4123],{},"析构函数中如果释放资源失败，通常只记录错误，不继续抛出异常。",[101,4125,4127],{"className":103,"code":4126,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\nusing namespace std;\n\nclass File\n{\npublic:\n    ~File()\n    {\n        \u002F\u002F 析构函数中尽量不要 throw\n        cout \u003C\u003C \"释放文件资源\" \u003C\u003C endl;\n    }\n};\n",[60,4128,4129,4135,4145,4149,4156,4160,4164,4171,4175,4180,4193,4197],{"__ignoreMap":106},[110,4130,4131,4133],{"class":112,"line":113},[110,4132,176],{"class":116},[110,4134,180],{"class":179},[110,4136,4137,4139,4141,4143],{"class":112,"line":120},[110,4138,185],{"class":116},[110,4140,188],{"class":116},[110,4142,192],{"class":191},[110,4144,195],{"class":123},[110,4146,4147],{"class":112,"line":127},[110,4148,201],{"emptyLinePlaceholder":200},[110,4150,4151,4153],{"class":112,"line":134},[110,4152,3442],{"class":116},[110,4154,4155],{"class":191}," File\n",[110,4157,4158],{"class":112,"line":140},[110,4159,124],{"class":123},[110,4161,4162],{"class":112,"line":148},[110,4163,3463],{"class":116},[110,4165,4166,4169],{"class":112,"line":153},[110,4167,4168],{"class":191},"    ~File",[110,4170,312],{"class":123},[110,4172,4173],{"class":112,"line":159},[110,4174,255],{"class":123},[110,4176,4177],{"class":112,"line":268},[110,4178,4179],{"class":130},"        \u002F\u002F 析构函数中尽量不要 throw\n",[110,4181,4182,4184,4186,4189,4191],{"class":112,"line":274},[110,4183,361],{"class":123},[110,4185,364],{"class":116},[110,4187,4188],{"class":179}," \"释放文件资源\"",[110,4190,370],{"class":116},[110,4192,377],{"class":123},[110,4194,4195],{"class":112,"line":279},[110,4196,271],{"class":123},[110,4198,4199],{"class":112,"line":294},[110,4200,2160],{"class":123},[17,4202,4203],{},[49,4204,2863],{},[17,4206,4207],{},"析构函数中不要随便抛异常。",[465,4209],{},[13,4211,4213],{"id":4212},"异常与-raii","异常与 RAII",[17,4215,4216],{},"RAII 是现代 C++ 中非常重要的思想。",[17,4218,4219],{},"RAII 的核心思想是：",[4221,4222,4223],"blockquote",{},[17,4224,4225],{},"资源在对象构造时获取，在对象析构时释放。",[17,4227,4228],{},"常见资源包括：",[21,4230,4231,4234,4237,4240,4243,4246],{},[24,4232,4233],{},"堆内存",[24,4235,4236],{},"文件",[24,4238,4239],{},"串口",[24,4241,4242],{},"网络连接",[24,4244,4245],{},"锁",[24,4247,4248],{},"句柄",[17,4250,4251],{},"异常发生时，已经创建成功的局部对象会自动调用析构函数。",[1580,4253,4254],{"id":4254},"普通指针的问题",[17,4256,4257],{},[49,4258,166],{},[101,4260,4262],{"className":103,"code":4261,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid test()\n{\n    int* p = new int[100];\n\n    throw runtime_error(\"中途出现异常\");\n\n    delete[] p;\n}\n\nint main()\n{\n    try\n    {\n        test();\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,4263,4264,4270,4276,4286,4290,4298,4302,4327,4331,4344,4348,4356,4360,4364,4372,4376,4380,4384,4390,4394,4408,4412,4428,4432,4436,4444],{"__ignoreMap":106},[110,4265,4266,4268],{"class":112,"line":113},[110,4267,176],{"class":116},[110,4269,180],{"class":179},[110,4271,4272,4274],{"class":112,"line":120},[110,4273,176],{"class":116},[110,4275,1578],{"class":179},[110,4277,4278,4280,4282,4284],{"class":112,"line":127},[110,4279,185],{"class":116},[110,4281,188],{"class":116},[110,4283,192],{"class":191},[110,4285,195],{"class":123},[110,4287,4288],{"class":112,"line":134},[110,4289,201],{"emptyLinePlaceholder":200},[110,4291,4292,4294,4296],{"class":112,"line":140},[110,4293,528],{"class":116},[110,4295,770],{"class":191},[110,4297,312],{"class":123},[110,4299,4300],{"class":112,"line":148},[110,4301,124],{"class":123},[110,4303,4304,4307,4310,4312,4315,4318,4321,4324],{"class":112,"line":153},[110,4305,4306],{"class":116},"    int*",[110,4308,4309],{"class":123}," p ",[110,4311,340],{"class":116},[110,4313,4314],{"class":116}," new",[110,4316,4317],{"class":116}," int",[110,4319,4320],{"class":123},"[",[110,4322,4323],{"class":247},"100",[110,4325,4326],{"class":123},"];\n",[110,4328,4329],{"class":112,"line":159},[110,4330,201],{"emptyLinePlaceholder":200},[110,4332,4333,4335,4337,4339,4342],{"class":112,"line":268},[110,4334,781],{"class":116},[110,4336,1672],{"class":191},[110,4338,212],{"class":123},[110,4340,4341],{"class":179},"\"中途出现异常\"",[110,4343,355],{"class":123},[110,4345,4346],{"class":112,"line":274},[110,4347,201],{"emptyLinePlaceholder":200},[110,4349,4350,4353],{"class":112,"line":279},[110,4351,4352],{"class":116},"    delete[]",[110,4354,4355],{"class":123}," p;\n",[110,4357,4358],{"class":112,"line":294},[110,4359,137],{"class":123},[110,4361,4362],{"class":112,"line":299},[110,4363,201],{"emptyLinePlaceholder":200},[110,4365,4366,4368,4370],{"class":112,"line":304},[110,4367,206],{"class":116},[110,4369,309],{"class":191},[110,4371,312],{"class":123},[110,4373,4374],{"class":112,"line":315},[110,4375,124],{"class":123},[110,4377,4378],{"class":112,"line":320},[110,4379,323],{"class":116},[110,4381,4382],{"class":112,"line":326},[110,4383,255],{"class":123},[110,4385,4386,4388],{"class":112,"line":331},[110,4387,819],{"class":191},[110,4389,822],{"class":123},[110,4391,4392],{"class":112,"line":358},[110,4393,271],{"class":123},[110,4395,4396,4398,4400,4402,4404,4406],{"class":112,"line":380},[110,4397,388],{"class":116},[110,4399,391],{"class":123},[110,4401,394],{"class":116},[110,4403,2482],{"class":123},[110,4405,1639],{"class":116},[110,4407,837],{"class":123},[110,4409,4410],{"class":112,"line":385},[110,4411,255],{"class":123},[110,4413,4414,4416,4418,4420,4422,4424,4426],{"class":112,"line":403},[110,4415,361],{"class":123},[110,4417,364],{"class":116},[110,4419,1781],{"class":123},[110,4421,1784],{"class":191},[110,4423,1787],{"class":123},[110,4425,364],{"class":116},[110,4427,377],{"class":123},[110,4429,4430],{"class":112,"line":408},[110,4431,271],{"class":123},[110,4433,4434],{"class":112,"line":427},[110,4435,201],{"emptyLinePlaceholder":200},[110,4437,4438,4440,4442],{"class":112,"line":432},[110,4439,282],{"class":116},[110,4441,248],{"class":247},[110,4443,195],{"class":123},[110,4445,4446],{"class":112,"line":437},[110,4447,137],{"class":123},[17,4449,4450],{},[49,4451,453],{},[17,4453,4454,4456,4457,4460],{},[60,4455,72],{}," 之后，",[60,4458,4459],{},"delete[] p;"," 不会执行，可能造成内存泄漏。",[1580,4462,4464],{"id":4463},"使用-vector-避免资源泄漏","使用 vector 避免资源泄漏",[17,4466,4467],{},[49,4468,166],{},[101,4470,4472],{"className":103,"code":4471,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cvector>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid test()\n{\n    vector\u003Cint> nums(100);\n\n    throw runtime_error(\"中途出现异常\");\n\n    cout \u003C\u003C nums.size() \u003C\u003C endl;\n}\n\nint main()\n{\n    try\n    {\n        test();\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,4473,4474,4480,4486,4492,4502,4506,4514,4518,4533,4537,4549,4553,4570,4574,4578,4586,4590,4594,4598,4604,4608,4622,4626,4642,4646,4650,4658],{"__ignoreMap":106},[110,4475,4476,4478],{"class":112,"line":113},[110,4477,176],{"class":116},[110,4479,180],{"class":179},[110,4481,4482,4484],{"class":112,"line":120},[110,4483,176],{"class":116},[110,4485,2097],{"class":179},[110,4487,4488,4490],{"class":112,"line":127},[110,4489,176],{"class":116},[110,4491,1578],{"class":179},[110,4493,4494,4496,4498,4500],{"class":112,"line":134},[110,4495,185],{"class":116},[110,4497,188],{"class":116},[110,4499,192],{"class":191},[110,4501,195],{"class":123},[110,4503,4504],{"class":112,"line":140},[110,4505,201],{"emptyLinePlaceholder":200},[110,4507,4508,4510,4512],{"class":112,"line":148},[110,4509,528],{"class":116},[110,4511,770],{"class":191},[110,4513,312],{"class":123},[110,4515,4516],{"class":112,"line":153},[110,4517,124],{"class":123},[110,4519,4520,4522,4524,4527,4529,4531],{"class":112,"line":159},[110,4521,2134],{"class":123},[110,4523,2137],{"class":116},[110,4525,4526],{"class":191}," nums",[110,4528,212],{"class":123},[110,4530,4323],{"class":247},[110,4532,355],{"class":123},[110,4534,4535],{"class":112,"line":268},[110,4536,201],{"emptyLinePlaceholder":200},[110,4538,4539,4541,4543,4545,4547],{"class":112,"line":274},[110,4540,781],{"class":116},[110,4542,1672],{"class":191},[110,4544,212],{"class":123},[110,4546,4341],{"class":179},[110,4548,355],{"class":123},[110,4550,4551],{"class":112,"line":279},[110,4552,201],{"emptyLinePlaceholder":200},[110,4554,4555,4557,4559,4561,4564,4566,4568],{"class":112,"line":294},[110,4556,584],{"class":123},[110,4558,364],{"class":116},[110,4560,2181],{"class":123},[110,4562,4563],{"class":191},"size",[110,4565,1787],{"class":123},[110,4567,364],{"class":116},[110,4569,377],{"class":123},[110,4571,4572],{"class":112,"line":299},[110,4573,137],{"class":123},[110,4575,4576],{"class":112,"line":304},[110,4577,201],{"emptyLinePlaceholder":200},[110,4579,4580,4582,4584],{"class":112,"line":315},[110,4581,206],{"class":116},[110,4583,309],{"class":191},[110,4585,312],{"class":123},[110,4587,4588],{"class":112,"line":320},[110,4589,124],{"class":123},[110,4591,4592],{"class":112,"line":326},[110,4593,323],{"class":116},[110,4595,4596],{"class":112,"line":331},[110,4597,255],{"class":123},[110,4599,4600,4602],{"class":112,"line":358},[110,4601,819],{"class":191},[110,4603,822],{"class":123},[110,4605,4606],{"class":112,"line":380},[110,4607,271],{"class":123},[110,4609,4610,4612,4614,4616,4618,4620],{"class":112,"line":385},[110,4611,388],{"class":116},[110,4613,391],{"class":123},[110,4615,394],{"class":116},[110,4617,2482],{"class":123},[110,4619,1639],{"class":116},[110,4621,837],{"class":123},[110,4623,4624],{"class":112,"line":403},[110,4625,255],{"class":123},[110,4627,4628,4630,4632,4634,4636,4638,4640],{"class":112,"line":408},[110,4629,361],{"class":123},[110,4631,364],{"class":116},[110,4633,1781],{"class":123},[110,4635,1784],{"class":191},[110,4637,1787],{"class":123},[110,4639,364],{"class":116},[110,4641,377],{"class":123},[110,4643,4644],{"class":112,"line":427},[110,4645,271],{"class":123},[110,4647,4648],{"class":112,"line":432},[110,4649,201],{"emptyLinePlaceholder":200},[110,4651,4652,4654,4656],{"class":112,"line":437},[110,4653,282],{"class":116},[110,4655,248],{"class":247},[110,4657,195],{"class":123},[110,4659,4660],{"class":112,"line":446},[110,4661,137],{"class":123},[17,4663,4664],{},[49,4665,453],{},[17,4667,4668,4669,4671],{},"即使发生异常，",[60,4670,2070],{}," 对象也会自动析构，内部内存会自动释放。",[1580,4673,4674],{"id":4674},"使用智能指针管理资源",[101,4676,4678],{"className":103,"code":4677,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cmemory>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid test()\n{\n    unique_ptr\u003Cint[]> p(new int[100]);\n\n    throw runtime_error(\"中途出现异常\");\n}\n\nint main()\n{\n    try\n    {\n        test();\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C e.what() \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,4679,4680,4686,4693,4699,4709,4713,4721,4725,4756,4760,4772,4776,4780,4788,4792,4796,4800,4806,4810,4824,4828,4844,4848,4852,4860],{"__ignoreMap":106},[110,4681,4682,4684],{"class":112,"line":113},[110,4683,176],{"class":116},[110,4685,180],{"class":179},[110,4687,4688,4690],{"class":112,"line":120},[110,4689,176],{"class":116},[110,4691,4692],{"class":179}," \u003Cmemory>\n",[110,4694,4695,4697],{"class":112,"line":127},[110,4696,176],{"class":116},[110,4698,1578],{"class":179},[110,4700,4701,4703,4705,4707],{"class":112,"line":134},[110,4702,185],{"class":116},[110,4704,188],{"class":116},[110,4706,192],{"class":191},[110,4708,195],{"class":123},[110,4710,4711],{"class":112,"line":140},[110,4712,201],{"emptyLinePlaceholder":200},[110,4714,4715,4717,4719],{"class":112,"line":148},[110,4716,528],{"class":116},[110,4718,770],{"class":191},[110,4720,312],{"class":123},[110,4722,4723],{"class":112,"line":153},[110,4724,124],{"class":123},[110,4726,4727,4730,4733,4736,4739,4742,4744,4747,4749,4751,4753],{"class":112,"line":159},[110,4728,4729],{"class":123},"    unique_ptr",[110,4731,4732],{"class":116},"\u003Cint",[110,4734,4735],{"class":123},"[]",[110,4737,4738],{"class":116},">",[110,4740,4741],{"class":191}," p",[110,4743,212],{"class":123},[110,4745,4746],{"class":116},"new",[110,4748,4317],{"class":116},[110,4750,4320],{"class":123},[110,4752,4323],{"class":247},[110,4754,4755],{"class":123},"]);\n",[110,4757,4758],{"class":112,"line":268},[110,4759,201],{"emptyLinePlaceholder":200},[110,4761,4762,4764,4766,4768,4770],{"class":112,"line":274},[110,4763,781],{"class":116},[110,4765,1672],{"class":191},[110,4767,212],{"class":123},[110,4769,4341],{"class":179},[110,4771,355],{"class":123},[110,4773,4774],{"class":112,"line":279},[110,4775,137],{"class":123},[110,4777,4778],{"class":112,"line":294},[110,4779,201],{"emptyLinePlaceholder":200},[110,4781,4782,4784,4786],{"class":112,"line":299},[110,4783,206],{"class":116},[110,4785,309],{"class":191},[110,4787,312],{"class":123},[110,4789,4790],{"class":112,"line":304},[110,4791,124],{"class":123},[110,4793,4794],{"class":112,"line":315},[110,4795,323],{"class":116},[110,4797,4798],{"class":112,"line":320},[110,4799,255],{"class":123},[110,4801,4802,4804],{"class":112,"line":326},[110,4803,819],{"class":191},[110,4805,822],{"class":123},[110,4807,4808],{"class":112,"line":331},[110,4809,271],{"class":123},[110,4811,4812,4814,4816,4818,4820,4822],{"class":112,"line":358},[110,4813,388],{"class":116},[110,4815,391],{"class":123},[110,4817,394],{"class":116},[110,4819,2482],{"class":123},[110,4821,1639],{"class":116},[110,4823,837],{"class":123},[110,4825,4826],{"class":112,"line":380},[110,4827,255],{"class":123},[110,4829,4830,4832,4834,4836,4838,4840,4842],{"class":112,"line":385},[110,4831,361],{"class":123},[110,4833,364],{"class":116},[110,4835,1781],{"class":123},[110,4837,1784],{"class":191},[110,4839,1787],{"class":123},[110,4841,364],{"class":116},[110,4843,377],{"class":123},[110,4845,4846],{"class":112,"line":403},[110,4847,271],{"class":123},[110,4849,4850],{"class":112,"line":408},[110,4851,201],{"emptyLinePlaceholder":200},[110,4853,4854,4856,4858],{"class":112,"line":427},[110,4855,282],{"class":116},[110,4857,248],{"class":247},[110,4859,195],{"class":123},[110,4861,4862],{"class":112,"line":432},[110,4863,137],{"class":123},[17,4865,4866],{},[49,4867,453],{},[17,4869,4870,4873,4874,2324],{},[60,4871,4872],{},"unique_ptr"," 会自动释放内存，不需要手动 ",[60,4875,4876],{},"delete[]",[17,4878,4879],{},[49,4880,2863],{},[17,4882,4883],{},"异常处理要和 RAII 一起理解。",[17,4885,4886],{},"现代 C++ 中，应该优先使用：",[21,4888,4889,4894,4898,4902,4907,4912],{},[24,4890,4891],{},[60,4892,4893],{},"string",[24,4895,4896],{},[60,4897,2070],{},[24,4899,4900],{},[60,4901,4872],{},[24,4903,4904],{},[60,4905,4906],{},"shared_ptr",[24,4908,4909],{},[60,4910,4911],{},"fstream",[24,4913,4914],{},"自定义类的构造和析构",[17,4916,4917,4918,2324],{},"来管理资源，减少手动 ",[60,4919,4920],{},"new\u002Fdelete",[465,4922],{},[13,4924,4925],{"id":4925},"异常和返回值错误码",[17,4927,4928],{},"异常不是所有地方都适合使用。",[1580,4930,4931],{"id":4931},"适合使用异常的情况",[17,4933,4934],{},"异常适合处理“不应该频繁发生”的严重错误。",[17,4936,4033],{},[21,4938,4939,4942,4944,4947,4950],{},[24,4940,4941],{},"配置文件不存在",[24,4943,29],{},[24,4945,4946],{},"参数明显错误",[24,4948,4949],{},"初始化失败",[24,4951,4952],{},"程序无法继续运行",[17,4954,4955],{},[49,4956,166],{},[101,4958,4960],{"className":103,"code":4959,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nvoid initSystem(const string& configPath)\n{\n    if (configPath.empty())\n    {\n        throw runtime_error(\"配置文件路径为空\");\n    }\n\n    cout \u003C\u003C \"系统初始化成功\" \u003C\u003C endl;\n}\n\nint main()\n{\n    try\n    {\n        initSystem(\"\");\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"初始化失败：\" \u003C\u003C e.what() \u003C\u003C endl;\n        return 1;\n    }\n\n    return 0;\n}\n",[60,4961,4962,4968,4974,4984,4988,5008,5012,5023,5027,5040,5044,5048,5061,5065,5069,5077,5081,5085,5089,5100,5104,5118,5122,5143,5152,5156,5160,5168],{"__ignoreMap":106},[110,4963,4964,4966],{"class":112,"line":113},[110,4965,176],{"class":116},[110,4967,180],{"class":179},[110,4969,4970,4972],{"class":112,"line":120},[110,4971,176],{"class":116},[110,4973,1578],{"class":179},[110,4975,4976,4978,4980,4982],{"class":112,"line":127},[110,4977,185],{"class":116},[110,4979,188],{"class":116},[110,4981,192],{"class":191},[110,4983,195],{"class":123},[110,4985,4986],{"class":112,"line":134},[110,4987,201],{"emptyLinePlaceholder":200},[110,4989,4990,4992,4995,4997,4999,5001,5003,5006],{"class":112,"line":140},[110,4991,528],{"class":116},[110,4993,4994],{"class":191}," initSystem",[110,4996,212],{"class":123},[110,4998,394],{"class":116},[110,5000,1636],{"class":191},[110,5002,1639],{"class":116},[110,5004,5005],{"class":217}," configPath",[110,5007,229],{"class":123},[110,5009,5010],{"class":112,"line":148},[110,5011,124],{"class":123},[110,5013,5014,5016,5019,5021],{"class":112,"line":153},[110,5015,238],{"class":116},[110,5017,5018],{"class":123}," (configPath.",[110,5020,1658],{"class":191},[110,5022,1661],{"class":123},[110,5024,5025],{"class":112,"line":159},[110,5026,255],{"class":123},[110,5028,5029,5031,5033,5035,5038],{"class":112,"line":268},[110,5030,260],{"class":116},[110,5032,1672],{"class":191},[110,5034,212],{"class":123},[110,5036,5037],{"class":179},"\"配置文件路径为空\"",[110,5039,355],{"class":123},[110,5041,5042],{"class":112,"line":274},[110,5043,271],{"class":123},[110,5045,5046],{"class":112,"line":279},[110,5047,201],{"emptyLinePlaceholder":200},[110,5049,5050,5052,5054,5057,5059],{"class":112,"line":294},[110,5051,584],{"class":123},[110,5053,364],{"class":116},[110,5055,5056],{"class":179}," \"系统初始化成功\"",[110,5058,370],{"class":116},[110,5060,377],{"class":123},[110,5062,5063],{"class":112,"line":299},[110,5064,137],{"class":123},[110,5066,5067],{"class":112,"line":304},[110,5068,201],{"emptyLinePlaceholder":200},[110,5070,5071,5073,5075],{"class":112,"line":315},[110,5072,206],{"class":116},[110,5074,309],{"class":191},[110,5076,312],{"class":123},[110,5078,5079],{"class":112,"line":320},[110,5080,124],{"class":123},[110,5082,5083],{"class":112,"line":326},[110,5084,323],{"class":116},[110,5086,5087],{"class":112,"line":331},[110,5088,255],{"class":123},[110,5090,5091,5094,5096,5098],{"class":112,"line":358},[110,5092,5093],{"class":191},"        initSystem",[110,5095,212],{"class":123},[110,5097,1743],{"class":179},[110,5099,355],{"class":123},[110,5101,5102],{"class":112,"line":380},[110,5103,271],{"class":123},[110,5105,5106,5108,5110,5112,5114,5116],{"class":112,"line":385},[110,5107,388],{"class":116},[110,5109,391],{"class":123},[110,5111,394],{"class":116},[110,5113,2482],{"class":123},[110,5115,1639],{"class":116},[110,5117,837],{"class":123},[110,5119,5120],{"class":112,"line":403},[110,5121,255],{"class":123},[110,5123,5124,5126,5128,5131,5133,5135,5137,5139,5141],{"class":112,"line":408},[110,5125,361],{"class":123},[110,5127,364],{"class":116},[110,5129,5130],{"class":179}," \"初始化失败：\"",[110,5132,370],{"class":116},[110,5134,1781],{"class":123},[110,5136,1784],{"class":191},[110,5138,1787],{"class":123},[110,5140,364],{"class":116},[110,5142,377],{"class":123},[110,5144,5145,5148,5150],{"class":112,"line":427},[110,5146,5147],{"class":116},"        return",[110,5149,971],{"class":247},[110,5151,195],{"class":123},[110,5153,5154],{"class":112,"line":432},[110,5155,271],{"class":123},[110,5157,5158],{"class":112,"line":437},[110,5159,201],{"emptyLinePlaceholder":200},[110,5161,5162,5164,5166],{"class":112,"line":446},[110,5163,282],{"class":116},[110,5165,248],{"class":247},[110,5167,195],{"class":123},[110,5169,5170],{"class":112,"line":1115},[110,5171,137],{"class":123},[1580,5173,5174],{"id":5174},"适合使用返回值的情况",[17,5176,5177],{},"对于经常发生、可以恢复的小错误，可以用返回值。",[17,5179,4033],{},[21,5181,5182,5185,5188,5191],{},[24,5183,5184],{},"串口偶尔读取失败",[24,5186,5187],{},"网络偶尔超时",[24,5189,5190],{},"传感器某一帧数据无效",[24,5192,5193],{},"电机反馈偶尔丢包",[17,5195,5196],{},[49,5197,166],{},[101,5199,5201],{"className":103,"code":5200,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\nusing namespace std;\n\nbool readEncoder()\n{\n    \u002F\u002F 模拟读取失败\n    return false;\n}\n\nint main()\n{\n    if (!readEncoder())\n    {\n        cout \u003C\u003C \"编码器读取失败，本次循环跳过\" \u003C\u003C endl;\n        return 0;\n    }\n\n    cout \u003C\u003C \"编码器读取成功\" \u003C\u003C endl;\n\n    return 0;\n}\n",[60,5202,5203,5209,5219,5223,5233,5237,5242,5251,5255,5259,5267,5271,5285,5289,5302,5310,5314,5318,5331,5335,5343],{"__ignoreMap":106},[110,5204,5205,5207],{"class":112,"line":113},[110,5206,176],{"class":116},[110,5208,180],{"class":179},[110,5210,5211,5213,5215,5217],{"class":112,"line":120},[110,5212,185],{"class":116},[110,5214,188],{"class":116},[110,5216,192],{"class":191},[110,5218,195],{"class":123},[110,5220,5221],{"class":112,"line":127},[110,5222,201],{"emptyLinePlaceholder":200},[110,5224,5225,5228,5231],{"class":112,"line":134},[110,5226,5227],{"class":116},"bool",[110,5229,5230],{"class":191}," readEncoder",[110,5232,312],{"class":123},[110,5234,5235],{"class":112,"line":140},[110,5236,124],{"class":123},[110,5238,5239],{"class":112,"line":148},[110,5240,5241],{"class":130},"    \u002F\u002F 模拟读取失败\n",[110,5243,5244,5246,5249],{"class":112,"line":153},[110,5245,282],{"class":116},[110,5247,5248],{"class":247}," false",[110,5250,195],{"class":123},[110,5252,5253],{"class":112,"line":159},[110,5254,137],{"class":123},[110,5256,5257],{"class":112,"line":268},[110,5258,201],{"emptyLinePlaceholder":200},[110,5260,5261,5263,5265],{"class":112,"line":274},[110,5262,206],{"class":116},[110,5264,309],{"class":191},[110,5266,312],{"class":123},[110,5268,5269],{"class":112,"line":279},[110,5270,124],{"class":123},[110,5272,5273,5275,5277,5280,5283],{"class":112,"line":294},[110,5274,238],{"class":116},[110,5276,391],{"class":123},[110,5278,5279],{"class":116},"!",[110,5281,5282],{"class":191},"readEncoder",[110,5284,1661],{"class":123},[110,5286,5287],{"class":112,"line":299},[110,5288,255],{"class":123},[110,5290,5291,5293,5295,5298,5300],{"class":112,"line":304},[110,5292,361],{"class":123},[110,5294,364],{"class":116},[110,5296,5297],{"class":179}," \"编码器读取失败，本次循环跳过\"",[110,5299,370],{"class":116},[110,5301,377],{"class":123},[110,5303,5304,5306,5308],{"class":112,"line":315},[110,5305,5147],{"class":116},[110,5307,248],{"class":247},[110,5309,195],{"class":123},[110,5311,5312],{"class":112,"line":320},[110,5313,271],{"class":123},[110,5315,5316],{"class":112,"line":326},[110,5317,201],{"emptyLinePlaceholder":200},[110,5319,5320,5322,5324,5327,5329],{"class":112,"line":331},[110,5321,584],{"class":123},[110,5323,364],{"class":116},[110,5325,5326],{"class":179}," \"编码器读取成功\"",[110,5328,370],{"class":116},[110,5330,377],{"class":123},[110,5332,5333],{"class":112,"line":358},[110,5334,201],{"emptyLinePlaceholder":200},[110,5336,5337,5339,5341],{"class":112,"line":380},[110,5338,282],{"class":116},[110,5340,248],{"class":247},[110,5342,195],{"class":123},[110,5344,5345],{"class":112,"line":385},[110,5346,137],{"class":123},[17,5348,5349],{},[49,5350,2863],{},[21,5352,5353,5356],{},[24,5354,5355],{},"初始化阶段的大错误，可以用异常",[24,5357,5358],{},"运行循环中的常见错误，优先用返回值或状态码",[465,5360],{},[13,5362,5364],{"id":5363},"ros2-机器人项目中的异常使用思路","ROS2 \u002F 机器人项目中的异常使用思路",[17,5366,5367],{},"在 ROS2 或机器人项目中，异常处理要谨慎使用。",[1580,5369,5370],{"id":5370},"适合抛异常的位置",[17,5372,5373],{},"例如节点启动阶段：",[21,5375,5376,5379,5381,5384,5387],{},[24,5377,5378],{},"参数读取失败",[24,5380,4941],{},[24,5382,5383],{},"串口无法打开",[24,5385,5386],{},"CAN 设备无法打开",[24,5388,5389],{},"硬件初始化失败",[17,5391,5392],{},[49,5393,166],{},[101,5395,5397],{"className":103,"code":5396,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nclass MotorDriver\n{\npublic:\n    MotorDriver(const string& device)\n    {\n        if (device.empty())\n        {\n            throw runtime_error(\"电机驱动初始化失败：设备名为空\");\n        }\n\n        cout \u003C\u003C \"电机驱动初始化成功：\" \u003C\u003C device \u003C\u003C endl;\n    }\n};\n\nint main()\n{\n    try\n    {\n        MotorDriver driver(\"\");\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"程序启动失败：\" \u003C\u003C e.what() \u003C\u003C endl;\n        return 1;\n    }\n\n    return 0;\n}\n",[60,5398,5399,5405,5411,5421,5425,5432,5436,5440,5457,5461,5471,5475,5488,5492,5496,5513,5517,5521,5525,5533,5537,5541,5545,5559,5563,5577,5581,5602,5610,5614,5618,5626],{"__ignoreMap":106},[110,5400,5401,5403],{"class":112,"line":113},[110,5402,176],{"class":116},[110,5404,180],{"class":179},[110,5406,5407,5409],{"class":112,"line":120},[110,5408,176],{"class":116},[110,5410,1578],{"class":179},[110,5412,5413,5415,5417,5419],{"class":112,"line":127},[110,5414,185],{"class":116},[110,5416,188],{"class":116},[110,5418,192],{"class":191},[110,5420,195],{"class":123},[110,5422,5423],{"class":112,"line":134},[110,5424,201],{"emptyLinePlaceholder":200},[110,5426,5427,5429],{"class":112,"line":140},[110,5428,3442],{"class":116},[110,5430,5431],{"class":191}," MotorDriver\n",[110,5433,5434],{"class":112,"line":148},[110,5435,124],{"class":123},[110,5437,5438],{"class":112,"line":153},[110,5439,3463],{"class":116},[110,5441,5442,5445,5447,5449,5451,5453,5455],{"class":112,"line":159},[110,5443,5444],{"class":191},"    MotorDriver",[110,5446,212],{"class":123},[110,5448,394],{"class":116},[110,5450,1636],{"class":191},[110,5452,1639],{"class":116},[110,5454,1642],{"class":217},[110,5456,229],{"class":123},[110,5458,5459],{"class":112,"line":268},[110,5460,255],{"class":123},[110,5462,5463,5465,5467,5469],{"class":112,"line":274},[110,5464,3831],{"class":116},[110,5466,1655],{"class":123},[110,5468,1658],{"class":191},[110,5470,1661],{"class":123},[110,5472,5473],{"class":112,"line":279},[110,5474,3842],{"class":123},[110,5476,5477,5479,5481,5483,5486],{"class":112,"line":294},[110,5478,3847],{"class":116},[110,5480,1672],{"class":191},[110,5482,212],{"class":123},[110,5484,5485],{"class":179},"\"电机驱动初始化失败：设备名为空\"",[110,5487,355],{"class":123},[110,5489,5490],{"class":112,"line":299},[110,5491,3861],{"class":123},[110,5493,5494],{"class":112,"line":304},[110,5495,201],{"emptyLinePlaceholder":200},[110,5497,5498,5500,5502,5505,5507,5509,5511],{"class":112,"line":315},[110,5499,361],{"class":123},[110,5501,364],{"class":116},[110,5503,5504],{"class":179}," \"电机驱动初始化成功：\"",[110,5506,370],{"class":116},[110,5508,1701],{"class":123},[110,5510,364],{"class":116},[110,5512,377],{"class":123},[110,5514,5515],{"class":112,"line":320},[110,5516,271],{"class":123},[110,5518,5519],{"class":112,"line":326},[110,5520,2160],{"class":123},[110,5522,5523],{"class":112,"line":331},[110,5524,201],{"emptyLinePlaceholder":200},[110,5526,5527,5529,5531],{"class":112,"line":358},[110,5528,206],{"class":116},[110,5530,309],{"class":191},[110,5532,312],{"class":123},[110,5534,5535],{"class":112,"line":380},[110,5536,124],{"class":123},[110,5538,5539],{"class":112,"line":385},[110,5540,323],{"class":116},[110,5542,5543],{"class":112,"line":403},[110,5544,255],{"class":123},[110,5546,5547,5550,5553,5555,5557],{"class":112,"line":408},[110,5548,5549],{"class":123},"        MotorDriver ",[110,5551,5552],{"class":191},"driver",[110,5554,212],{"class":123},[110,5556,1743],{"class":179},[110,5558,355],{"class":123},[110,5560,5561],{"class":112,"line":427},[110,5562,271],{"class":123},[110,5564,5565,5567,5569,5571,5573,5575],{"class":112,"line":432},[110,5566,388],{"class":116},[110,5568,391],{"class":123},[110,5570,394],{"class":116},[110,5572,2482],{"class":123},[110,5574,1639],{"class":116},[110,5576,837],{"class":123},[110,5578,5579],{"class":112,"line":437},[110,5580,255],{"class":123},[110,5582,5583,5585,5587,5590,5592,5594,5596,5598,5600],{"class":112,"line":446},[110,5584,361],{"class":123},[110,5586,364],{"class":116},[110,5588,5589],{"class":179}," \"程序启动失败：\"",[110,5591,370],{"class":116},[110,5593,1781],{"class":123},[110,5595,1784],{"class":191},[110,5597,1787],{"class":123},[110,5599,364],{"class":116},[110,5601,377],{"class":123},[110,5603,5604,5606,5608],{"class":112,"line":1115},[110,5605,5147],{"class":116},[110,5607,971],{"class":247},[110,5609,195],{"class":123},[110,5611,5612],{"class":112,"line":1133},[110,5613,271],{"class":123},[110,5615,5616],{"class":112,"line":1138},[110,5617,201],{"emptyLinePlaceholder":200},[110,5619,5620,5622,5624],{"class":112,"line":1150},[110,5621,282],{"class":116},[110,5623,248],{"class":247},[110,5625,195],{"class":123},[110,5627,5628],{"class":112,"line":1155},[110,5629,137],{"class":123},[1580,5631,5632],{"id":5632},"不适合频繁抛异常的位置",[17,5634,5635],{},"例如控制循环中：",[101,5637,5639],{"className":103,"code":5638,"language":105,"meta":106,"style":106},"while (true)\n{\n    \u002F\u002F 不推荐每次通信失败都 throw\n}\n",[60,5640,5641,5653,5657,5662],{"__ignoreMap":106},[110,5642,5643,5646,5648,5651],{"class":112,"line":113},[110,5644,5645],{"class":116},"while",[110,5647,391],{"class":123},[110,5649,5650],{"class":247},"true",[110,5652,229],{"class":123},[110,5654,5655],{"class":112,"line":120},[110,5656,124],{"class":123},[110,5658,5659],{"class":112,"line":127},[110,5660,5661],{"class":130},"    \u002F\u002F 不推荐每次通信失败都 throw\n",[110,5663,5664],{"class":112,"line":134},[110,5665,137],{"class":123},[17,5667,5668],{},"更推荐：",[101,5670,5672],{"className":103,"code":5671,"language":105,"meta":106,"style":106},"bool readMotorState()\n{\n    \u002F\u002F 读取失败返回 false\n    return false;\n}\n\nint main()\n{\n    if (!readMotorState())\n    {\n        cout \u003C\u003C \"读取电机状态失败，跳过本次控制周期\" \u003C\u003C endl;\n    }\n\n    return 0;\n}\n",[60,5673,5674,5683,5687,5692,5700,5704,5708,5716,5720,5733,5737,5750,5754,5758,5766],{"__ignoreMap":106},[110,5675,5676,5678,5681],{"class":112,"line":113},[110,5677,5227],{"class":116},[110,5679,5680],{"class":191}," readMotorState",[110,5682,312],{"class":123},[110,5684,5685],{"class":112,"line":120},[110,5686,124],{"class":123},[110,5688,5689],{"class":112,"line":127},[110,5690,5691],{"class":130},"    \u002F\u002F 读取失败返回 false\n",[110,5693,5694,5696,5698],{"class":112,"line":134},[110,5695,282],{"class":116},[110,5697,5248],{"class":247},[110,5699,195],{"class":123},[110,5701,5702],{"class":112,"line":140},[110,5703,137],{"class":123},[110,5705,5706],{"class":112,"line":148},[110,5707,201],{"emptyLinePlaceholder":200},[110,5709,5710,5712,5714],{"class":112,"line":153},[110,5711,206],{"class":116},[110,5713,309],{"class":191},[110,5715,312],{"class":123},[110,5717,5718],{"class":112,"line":159},[110,5719,124],{"class":123},[110,5721,5722,5724,5726,5728,5731],{"class":112,"line":268},[110,5723,238],{"class":116},[110,5725,391],{"class":123},[110,5727,5279],{"class":116},[110,5729,5730],{"class":191},"readMotorState",[110,5732,1661],{"class":123},[110,5734,5735],{"class":112,"line":274},[110,5736,255],{"class":123},[110,5738,5739,5741,5743,5746,5748],{"class":112,"line":279},[110,5740,361],{"class":123},[110,5742,364],{"class":116},[110,5744,5745],{"class":179}," \"读取电机状态失败，跳过本次控制周期\"",[110,5747,370],{"class":116},[110,5749,377],{"class":123},[110,5751,5752],{"class":112,"line":294},[110,5753,271],{"class":123},[110,5755,5756],{"class":112,"line":299},[110,5757,201],{"emptyLinePlaceholder":200},[110,5759,5760,5762,5764],{"class":112,"line":304},[110,5761,282],{"class":116},[110,5763,248],{"class":247},[110,5765,195],{"class":123},[110,5767,5768],{"class":112,"line":315},[110,5769,137],{"class":123},[17,5771,5772],{},[49,5773,2863],{},[17,5775,5776],{},"机器人控制中，周期性代码更关注稳定性和实时性，不要让异常在高频控制循环中到处乱飞。",[465,5778],{},[13,5780,5782],{"id":5781},"noexcept-简介","noexcept 简介",[17,5784,5785,5788],{},[60,5786,5787],{},"noexcept"," 表示一个函数承诺不抛出异常。",[17,5790,5791],{},[49,5792,99],{},[101,5794,5796],{"className":103,"code":5795,"language":105,"meta":106,"style":106},"void func() noexcept\n{\n}\n",[60,5797,5798,5810,5814],{"__ignoreMap":106},[110,5799,5800,5802,5805,5807],{"class":112,"line":113},[110,5801,528],{"class":116},[110,5803,5804],{"class":191}," func",[110,5806,1787],{"class":123},[110,5808,5809],{"class":116},"noexcept\n",[110,5811,5812],{"class":112,"line":120},[110,5813,124],{"class":123},[110,5815,5816],{"class":112,"line":127},[110,5817,137],{"class":123},[17,5819,5820],{},[49,5821,166],{},[101,5823,5825],{"className":103,"code":5824,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\nusing namespace std;\n\nvoid test() noexcept\n{\n    cout \u003C\u003C \"这个函数承诺不抛异常\" \u003C\u003C endl;\n}\n\nint main()\n{\n    test();\n\n    return 0;\n}\n",[60,5826,5827,5833,5843,5847,5857,5861,5874,5878,5882,5890,5894,5900,5904,5912],{"__ignoreMap":106},[110,5828,5829,5831],{"class":112,"line":113},[110,5830,176],{"class":116},[110,5832,180],{"class":179},[110,5834,5835,5837,5839,5841],{"class":112,"line":120},[110,5836,185],{"class":116},[110,5838,188],{"class":116},[110,5840,192],{"class":191},[110,5842,195],{"class":123},[110,5844,5845],{"class":112,"line":127},[110,5846,201],{"emptyLinePlaceholder":200},[110,5848,5849,5851,5853,5855],{"class":112,"line":134},[110,5850,528],{"class":116},[110,5852,770],{"class":191},[110,5854,1787],{"class":123},[110,5856,5809],{"class":116},[110,5858,5859],{"class":112,"line":140},[110,5860,124],{"class":123},[110,5862,5863,5865,5867,5870,5872],{"class":112,"line":148},[110,5864,584],{"class":123},[110,5866,364],{"class":116},[110,5868,5869],{"class":179}," \"这个函数承诺不抛异常\"",[110,5871,370],{"class":116},[110,5873,377],{"class":123},[110,5875,5876],{"class":112,"line":153},[110,5877,137],{"class":123},[110,5879,5880],{"class":112,"line":159},[110,5881,201],{"emptyLinePlaceholder":200},[110,5883,5884,5886,5888],{"class":112,"line":268},[110,5885,206],{"class":116},[110,5887,309],{"class":191},[110,5889,312],{"class":123},[110,5891,5892],{"class":112,"line":274},[110,5893,124],{"class":123},[110,5895,5896,5898],{"class":112,"line":279},[110,5897,1456],{"class":191},[110,5899,822],{"class":123},[110,5901,5902],{"class":112,"line":294},[110,5903,201],{"emptyLinePlaceholder":200},[110,5905,5906,5908,5910],{"class":112,"line":299},[110,5907,282],{"class":116},[110,5909,248],{"class":247},[110,5911,195],{"class":123},[110,5913,5914],{"class":112,"line":304},[110,5915,137],{"class":123},[17,5917,5918],{},[49,5919,1433],{},[17,5921,5922,5923,5925],{},"如果一个 ",[60,5924,5787],{}," 函数中真的抛出了异常，程序通常会直接终止。",[101,5927,5929],{"className":103,"code":5928,"language":105,"meta":106,"style":106},"void test() noexcept\n{\n    \u002F\u002F 不应该这样写\n    \u002F\u002F throw runtime_error(\"错误\");\n}\n",[60,5930,5931,5941,5945,5950,5955],{"__ignoreMap":106},[110,5932,5933,5935,5937,5939],{"class":112,"line":113},[110,5934,528],{"class":116},[110,5936,770],{"class":191},[110,5938,1787],{"class":123},[110,5940,5809],{"class":116},[110,5942,5943],{"class":112,"line":120},[110,5944,124],{"class":123},[110,5946,5947],{"class":112,"line":127},[110,5948,5949],{"class":130},"    \u002F\u002F 不应该这样写\n",[110,5951,5952],{"class":112,"line":134},[110,5953,5954],{"class":130},"    \u002F\u002F throw runtime_error(\"错误\");\n",[110,5956,5957],{"class":112,"line":140},[110,5958,137],{"class":123},[17,5960,5961],{},"普通学习阶段只需要知道：",[21,5963,5964,5969,5972],{},[24,5965,5966,5968],{},[60,5967,5787],{}," 表示函数不抛异常",[24,5970,5971],{},"析构函数、移动构造函数、底层资源释放函数中经常会看到它",[24,5973,5974],{},"现阶段不需要深入研究底层机制",[465,5976],{},[13,5978,5979],{"id":5979},"异常处理注意事项",[1580,5981,5982],{"id":5982},"尽量使用引用捕获",[17,5984,5985],{},"推荐：",[101,5987,5989],{"className":103,"code":5988,"language":105,"meta":106,"style":106},"catch (const exception& e)\n{\n    cout \u003C\u003C e.what() \u003C\u003C endl;\n}\n",[60,5990,5991,6005,6009,6025],{"__ignoreMap":106},[110,5992,5993,5995,5997,5999,6001,6003],{"class":112,"line":113},[110,5994,67],{"class":116},[110,5996,391],{"class":123},[110,5998,394],{"class":116},[110,6000,2482],{"class":123},[110,6002,1639],{"class":116},[110,6004,837],{"class":123},[110,6006,6007],{"class":112,"line":120},[110,6008,124],{"class":123},[110,6010,6011,6013,6015,6017,6019,6021,6023],{"class":112,"line":127},[110,6012,584],{"class":123},[110,6014,364],{"class":116},[110,6016,1781],{"class":123},[110,6018,1784],{"class":191},[110,6020,1787],{"class":123},[110,6022,364],{"class":116},[110,6024,377],{"class":123},[110,6026,6027],{"class":112,"line":134},[110,6028,137],{"class":123},[17,6030,6031],{},"不推荐：",[101,6033,6035],{"className":103,"code":6034,"language":105,"meta":106,"style":106},"catch (exception e)\n{\n    cout \u003C\u003C e.what() \u003C\u003C endl;\n}\n",[60,6036,6037,6044,6048,6064],{"__ignoreMap":106},[110,6038,6039,6041],{"class":112,"line":113},[110,6040,67],{"class":116},[110,6042,6043],{"class":123}," (exception e)\n",[110,6045,6046],{"class":112,"line":120},[110,6047,124],{"class":123},[110,6049,6050,6052,6054,6056,6058,6060,6062],{"class":112,"line":127},[110,6051,584],{"class":123},[110,6053,364],{"class":116},[110,6055,1781],{"class":123},[110,6057,1784],{"class":191},[110,6059,1787],{"class":123},[110,6061,364],{"class":116},[110,6063,377],{"class":123},[110,6065,6066],{"class":112,"line":134},[110,6067,137],{"class":123},[17,6069,6070],{},"原因：",[17,6072,6073],{},"按值捕获会产生拷贝，还可能造成对象切片问题。",[465,6075],{},[1580,6077,6078],{"id":6078},"不要滥用异常",[17,6080,6081,6082,2324],{},"异常适合处理异常情况，不适合替代普通的 ",[60,6083,6084],{},"if else",[17,6086,6031],{},[101,6088,6090],{"className":103,"code":6089,"language":105,"meta":106,"style":106},"try\n{\n    if (score \u003C 60)\n    {\n        throw \"不及格\";\n    }\n}\ncatch (...)\n{\n    cout \u003C\u003C \"成绩不及格\" \u003C\u003C endl;\n}\n",[60,6091,6092,6096,6100,6114,6118,6127,6131,6135,6141,6145,6158],{"__ignoreMap":106},[110,6093,6094],{"class":112,"line":113},[110,6095,117],{"class":116},[110,6097,6098],{"class":112,"line":120},[110,6099,124],{"class":123},[110,6101,6102,6104,6107,6109,6112],{"class":112,"line":127},[110,6103,238],{"class":116},[110,6105,6106],{"class":123}," (score ",[110,6108,554],{"class":116},[110,6110,6111],{"class":247}," 60",[110,6113,229],{"class":123},[110,6115,6116],{"class":112,"line":134},[110,6117,255],{"class":123},[110,6119,6120,6122,6125],{"class":112,"line":140},[110,6121,260],{"class":116},[110,6123,6124],{"class":179}," \"不及格\"",[110,6126,195],{"class":123},[110,6128,6129],{"class":112,"line":148},[110,6130,271],{"class":123},[110,6132,6133],{"class":112,"line":153},[110,6134,137],{"class":123},[110,6136,6137,6139],{"class":112,"line":159},[110,6138,67],{"class":116},[110,6140,1275],{"class":123},[110,6142,6143],{"class":112,"line":268},[110,6144,124],{"class":123},[110,6146,6147,6149,6151,6154,6156],{"class":112,"line":274},[110,6148,584],{"class":123},[110,6150,364],{"class":116},[110,6152,6153],{"class":179}," \"成绩不及格\"",[110,6155,370],{"class":116},[110,6157,377],{"class":123},[110,6159,6160],{"class":112,"line":279},[110,6161,137],{"class":123},[17,6163,6164],{},"普通逻辑直接写：",[101,6166,6168],{"className":103,"code":6167,"language":105,"meta":106,"style":106},"if (score \u003C 60)\n{\n    cout \u003C\u003C \"成绩不及格\" \u003C\u003C endl;\n}\n",[60,6169,6170,6183,6187,6199],{"__ignoreMap":106},[110,6171,6172,6175,6177,6179,6181],{"class":112,"line":113},[110,6173,6174],{"class":116},"if",[110,6176,6106],{"class":123},[110,6178,554],{"class":116},[110,6180,6111],{"class":247},[110,6182,229],{"class":123},[110,6184,6185],{"class":112,"line":120},[110,6186,124],{"class":123},[110,6188,6189,6191,6193,6195,6197],{"class":112,"line":127},[110,6190,584],{"class":123},[110,6192,364],{"class":116},[110,6194,6153],{"class":179},[110,6196,370],{"class":116},[110,6198,377],{"class":123},[110,6200,6201],{"class":112,"line":134},[110,6202,137],{"class":123},[465,6204],{},[1580,6206,6207],{"id":6207},"不要在析构函数中随便抛异常",[17,6209,6210],{},"析构函数中应该尽量保证安全释放资源。",[465,6212],{},[1580,6214,6215],{"id":6215},"标准异常优先于字符串异常",[17,6217,5985],{},[101,6219,6221],{"className":103,"code":6220,"language":105,"meta":106,"style":106},"throw runtime_error(\"文件打开失败\");\n",[60,6222,6223],{"__ignoreMap":106},[110,6224,6225,6227,6229,6231,6234],{"class":112,"line":113},[110,6226,72],{"class":116},[110,6228,1672],{"class":191},[110,6230,212],{"class":123},[110,6232,6233],{"class":179},"\"文件打开失败\"",[110,6235,355],{"class":123},[17,6237,6031],{},[101,6239,6241],{"className":103,"code":6240,"language":105,"meta":106,"style":106},"throw \"文件打开失败\";\n",[60,6242,6243],{"__ignoreMap":106},[110,6244,6245,6247,6250],{"class":112,"line":113},[110,6246,72],{"class":116},[110,6248,6249],{"class":179}," \"文件打开失败\"",[110,6251,195],{"class":123},[465,6253],{},[1580,6255,6257],{"id":6256},"main-函数中可以统一捕获严重异常","main 函数中可以统一捕获严重异常",[17,6259,6260],{},[49,6261,166],{},[101,6263,6265],{"className":103,"code":6264,"language":105,"meta":106,"style":106},"#include \u003Ciostream>\n#include \u003Cstdexcept>\nusing namespace std;\n\nint main()\n{\n    try\n    {\n        throw runtime_error(\"程序出现严重错误\");\n    }\n    catch (const exception& e)\n    {\n        cout \u003C\u003C \"fatal error：\" \u003C\u003C e.what() \u003C\u003C endl;\n        return 1;\n    }\n\n    return 0;\n}\n",[60,6266,6267,6273,6279,6289,6293,6301,6305,6309,6313,6326,6330,6344,6348,6369,6377,6381,6385,6393],{"__ignoreMap":106},[110,6268,6269,6271],{"class":112,"line":113},[110,6270,176],{"class":116},[110,6272,180],{"class":179},[110,6274,6275,6277],{"class":112,"line":120},[110,6276,176],{"class":116},[110,6278,1578],{"class":179},[110,6280,6281,6283,6285,6287],{"class":112,"line":127},[110,6282,185],{"class":116},[110,6284,188],{"class":116},[110,6286,192],{"class":191},[110,6288,195],{"class":123},[110,6290,6291],{"class":112,"line":134},[110,6292,201],{"emptyLinePlaceholder":200},[110,6294,6295,6297,6299],{"class":112,"line":140},[110,6296,206],{"class":116},[110,6298,309],{"class":191},[110,6300,312],{"class":123},[110,6302,6303],{"class":112,"line":148},[110,6304,124],{"class":123},[110,6306,6307],{"class":112,"line":153},[110,6308,323],{"class":116},[110,6310,6311],{"class":112,"line":159},[110,6312,255],{"class":123},[110,6314,6315,6317,6319,6321,6324],{"class":112,"line":268},[110,6316,260],{"class":116},[110,6318,1672],{"class":191},[110,6320,212],{"class":123},[110,6322,6323],{"class":179},"\"程序出现严重错误\"",[110,6325,355],{"class":123},[110,6327,6328],{"class":112,"line":274},[110,6329,271],{"class":123},[110,6331,6332,6334,6336,6338,6340,6342],{"class":112,"line":279},[110,6333,388],{"class":116},[110,6335,391],{"class":123},[110,6337,394],{"class":116},[110,6339,2482],{"class":123},[110,6341,1639],{"class":116},[110,6343,837],{"class":123},[110,6345,6346],{"class":112,"line":294},[110,6347,255],{"class":123},[110,6349,6350,6352,6354,6357,6359,6361,6363,6365,6367],{"class":112,"line":299},[110,6351,361],{"class":123},[110,6353,364],{"class":116},[110,6355,6356],{"class":179}," \"fatal error：\"",[110,6358,370],{"class":116},[110,6360,1781],{"class":123},[110,6362,1784],{"class":191},[110,6364,1787],{"class":123},[110,6366,364],{"class":116},[110,6368,377],{"class":123},[110,6370,6371,6373,6375],{"class":112,"line":304},[110,6372,5147],{"class":116},[110,6374,971],{"class":247},[110,6376,195],{"class":123},[110,6378,6379],{"class":112,"line":315},[110,6380,271],{"class":123},[110,6382,6383],{"class":112,"line":320},[110,6384,201],{"emptyLinePlaceholder":200},[110,6386,6387,6389,6391],{"class":112,"line":326},[110,6388,282],{"class":116},[110,6390,248],{"class":247},[110,6392,195],{"class":123},[110,6394,6395],{"class":112,"line":331},[110,6396,137],{"class":123},[17,6398,6399],{},[49,6400,453],{},[17,6402,6403,6404,6407],{},"程序出现严重异常后，在 ",[60,6405,6406],{},"main"," 函数中统一处理，避免程序直接崩溃且没有错误信息。",[465,6409],{},[13,6411,6412],{"id":6412},"总结",[17,6414,6415],{},"C++ 异常处理的核心内容：",[21,6417,6418,6423,6427,6432,6437,6442,6447,6450,6453,6456,6459],{},[24,6419,6420,6422],{},[60,6421,62],{},"：尝试执行可能出错的代码",[24,6424,6425,89],{},[60,6426,72],{},[24,6428,6429,6431],{},[60,6430,67],{},"：捕获并处理异常",[24,6433,6434,6436],{},[60,6435,1538],{},"：标准异常基类",[24,6438,6439,6441],{},[60,6440,1543],{},"：常用运行时异常",[24,6443,6444,6446],{},[60,6445,1820],{},"：获取异常信息",[24,6448,6449],{},"异常可以跨函数传递",[24,6451,6452],{},"构造函数可以抛异常",[24,6454,6455],{},"析构函数不要随便抛异常",[24,6457,6458],{},"异常处理要配合 RAII 理解",[24,6460,6078],{},[17,6462,6463],{},"对于普通 C++ 学习和 ROS2 工程开发来说，重点掌握：",[6465,6466,6467,6473,6478,6485,6488],"ol",{},[24,6468,6469,6470],{},"会写基本的 ",[60,6471,6472],{},"try \u002F catch \u002F throw",[24,6474,6475,6476],{},"会使用 ",[60,6477,1543],{},[24,6479,6480,6481,6484],{},"会用 ",[60,6482,6483],{},"catch (const std::exception& e)"," 统一捕获标准异常",[24,6486,6487],{},"知道异常适合初始化失败，不适合高频控制循环",[24,6489,6490],{},"理解 RAII 可以避免异常导致资源泄漏",[6492,6493,6494],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":106,"searchDepth":120,"depth":120,"links":6496},[6497],{"id":5,"depth":120,"text":5,"children":6498},[6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517],{"id":15,"depth":127,"text":15},{"id":469,"depth":127,"text":470},{"id":719,"depth":127,"text":720},{"id":901,"depth":127,"text":902},{"id":1252,"depth":127,"text":1252},{"id":1525,"depth":127,"text":1525},{"id":2317,"depth":127,"text":2318},{"id":2548,"depth":127,"text":2549},{"id":2871,"depth":127,"text":2871},{"id":3119,"depth":127,"text":3119},{"id":3391,"depth":127,"text":3391},{"id":3749,"depth":127,"text":3749},{"id":4055,"depth":127,"text":4055},{"id":4212,"depth":127,"text":4213},{"id":4925,"depth":127,"text":4925},{"id":5363,"depth":127,"text":5364},{"id":5781,"depth":127,"text":5782},{"id":5979,"depth":127,"text":5979},{"id":6412,"depth":127,"text":6412},0,"1600","2023-10-05","2023-10-05-cplusplus-jiao-xue","\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md",false,{},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma",{"title":5,"description":106},"wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","aF3RovKJg8_NBzSExrXAcC63hjDmB39up4TSmtrI20E",[6532,6537,6542,6547,6552,6557,6562,6567,6572,6577,6582,6587,6592,6597,6602,6607,6612,6617,6622,6627,6632,6637,6638,6643,6648,6653,6658,6663,6668,6673,6678,6683,6688,6693,6698,6703,6707,6712,6717,6722,6727,6732,6737,6742,6747,6752,6757,6762,6767,6772,6777,6782,6787,6792,6797,6802,6807,6812,6817,6822,6827,6832,6837,6842,6847,6852,6857,6862,6867,6872,6877,6882,6887,6892,6897,6902,6907,6912],{"path":6533,"stem":6534,"title":6535,"date":6520,"chapterOrder":6536,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++开发环境搭建与测试","0100",{"path":6538,"stem":6539,"title":6540,"date":6520,"chapterOrder":6541,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识","0200",{"path":6543,"stem":6544,"title":6545,"date":6520,"chapterOrder":6546,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放","0300",{"path":6548,"stem":6549,"title":6550,"date":6520,"chapterOrder":6551,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出","0400",{"path":6553,"stem":6554,"title":6555,"date":6520,"chapterOrder":6556,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符","0500",{"path":6558,"stem":6559,"title":6560,"date":6520,"chapterOrder":6561,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构","0600",{"path":6563,"stem":6564,"title":6565,"date":6520,"chapterOrder":6566,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组","0700",{"path":6568,"stem":6569,"title":6570,"date":6520,"chapterOrder":6571,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件","0800",{"path":6573,"stem":6574,"title":6575,"date":6520,"chapterOrder":6576,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针","0900",{"path":6578,"stem":6579,"title":6580,"date":6520,"chapterOrder":6581,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体","1000",{"path":6583,"stem":6584,"title":6585,"date":6520,"chapterOrder":6586,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期","1100",{"path":6588,"stem":6589,"title":6590,"date":6520,"chapterOrder":6591,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":6593,"stem":6594,"title":6595,"date":6520,"chapterOrder":6596,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函数提高与命名空间","1300",{"path":6598,"stem":6599,"title":6600,"date":6520,"chapterOrder":6601,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装","1400-0100",{"path":6603,"stem":6604,"title":6605,"date":6520,"chapterOrder":6606,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理","1400-0200",{"path":6608,"stem":6609,"title":6610,"date":6520,"chapterOrder":6611,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","对象模型与this指针","1400-0300",{"path":6613,"stem":6614,"title":6615,"date":6520,"chapterOrder":6616,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载","1400-0400",{"path":6618,"stem":6619,"title":6620,"date":6520,"chapterOrder":6621,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承","1400-0500",{"path":6623,"stem":6624,"title":6625,"date":6520,"chapterOrder":6626,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态","1400-0600",{"path":6628,"stem":6629,"title":6630,"date":6520,"chapterOrder":6631,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象","1400",{"path":6633,"stem":6634,"title":6635,"date":6520,"chapterOrder":6636,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":6527,"stem":6529,"title":5,"date":6520,"chapterOrder":6519,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},{"path":6639,"stem":6640,"title":6641,"date":6520,"chapterOrder":6642,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":6644,"stem":6645,"title":6646,"date":6520,"chapterOrder":6647,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识","1800-0100",{"path":6649,"stem":6650,"title":6651,"date":6520,"chapterOrder":6652,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":6654,"stem":6655,"title":6656,"date":6520,"chapterOrder":6657,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":6659,"stem":6660,"title":6661,"date":6520,"chapterOrder":6662,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-yu-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector与deque容器","vector与deque容器","1800-0400",{"path":6664,"stem":6665,"title":6666,"date":6520,"chapterOrder":6667,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-stack-queue-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-stack-queue-list容器","stack \u002F queue \u002F list 容器","1800-0500",{"path":6669,"stem":6670,"title":6671,"date":6520,"chapterOrder":6672,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-set-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-set-map容器","set \u002F map 容器","1800-0600",{"path":6674,"stem":6675,"title":6676,"date":6520,"chapterOrder":6677,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-函数对象与谓词","函数对象与谓词","1800-0700",{"path":6679,"stem":6680,"title":6681,"date":6520,"chapterOrder":6682,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-常用算法","常用算法","1800-0800",{"path":6684,"stem":6685,"title":6686,"date":6520,"chapterOrder":6687,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程","1800",{"path":6689,"stem":6690,"title":6691,"date":6520,"chapterOrder":6692,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换","1900",{"path":6694,"stem":6695,"title":6696,"date":6520,"chapterOrder":6697,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":6699,"stem":6700,"title":6701,"date":6520,"chapterOrder":6702,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":6704,"stem":6705,"title":185,"date":6520,"chapterOrder":6706,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":6708,"stem":6709,"title":6710,"date":6520,"chapterOrder":6711,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":6713,"stem":6714,"title":6715,"date":6520,"chapterOrder":6716,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环","2000-0500",{"path":6718,"stem":6719,"title":6720,"date":6520,"chapterOrder":6721,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定","2000-0600",{"path":6723,"stem":6724,"title":6725,"date":6520,"chapterOrder":6726,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":6728,"stem":6729,"title":6730,"date":6520,"chapterOrder":6731,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":6733,"stem":6734,"title":6735,"date":6520,"chapterOrder":6736,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针","2000-0900",{"path":6738,"stem":6739,"title":6740,"date":6520,"chapterOrder":6741,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移动语义","2000-1000",{"path":6743,"stem":6744,"title":6745,"date":6520,"chapterOrder":6746,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式","2000-1100",{"path":6748,"stem":6749,"title":6750,"date":6520,"chapterOrder":6751,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":6753,"stem":6754,"title":6755,"date":6520,"chapterOrder":6756,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":6758,"stem":6759,"title":6760,"date":6520,"chapterOrder":6761,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":6763,"stem":6764,"title":6765,"date":6520,"chapterOrder":6766,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":6768,"stem":6769,"title":6770,"date":6520,"chapterOrder":6771,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":6773,"stem":6774,"title":6775,"date":6520,"chapterOrder":6776,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":6778,"stem":6779,"title":6780,"date":6520,"chapterOrder":6781,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":6783,"stem":6784,"title":6785,"date":6520,"chapterOrder":6786,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 与 join","2000-1900-0100",{"path":6788,"stem":6789,"title":6790,"date":6520,"chapterOrder":6791,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 与 lock_guard","2000-1900-0200",{"path":6793,"stem":6794,"title":6795,"date":6520,"chapterOrder":6796,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":6798,"stem":6799,"title":6800,"date":6520,"chapterOrder":6801,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":6803,"stem":6804,"title":6805,"date":6520,"chapterOrder":6806,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","并发编程","2000-1900",{"path":6808,"stem":6809,"title":6810,"date":6520,"chapterOrder":6811,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":6813,"stem":6814,"title":6815,"date":6520,"chapterOrder":6816,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介","2000-2100",{"path":6818,"stem":6819,"title":6820,"date":6520,"chapterOrder":6821,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++","2000",{"path":6823,"stem":6824,"title":6825,"date":6520,"chapterOrder":6826,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定时器与异步 IO","2100-0100-0100",{"path":6828,"stem":6829,"title":6830,"date":6520,"chapterOrder":6831,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基础","2100-0100-0200",{"path":6833,"stem":6834,"title":6835,"date":6520,"chapterOrder":6836,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":6838,"stem":6839,"title":6840,"date":6520,"chapterOrder":6841,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":6843,"stem":6844,"title":6845,"date":6520,"chapterOrder":6846,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":6848,"stem":6849,"title":6850,"date":6520,"chapterOrder":6851,"chapterDepth":120,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成","2100-0100-0600",{"path":6853,"stem":6854,"title":6855,"date":6520,"chapterOrder":6856,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio异步IO库","2100-0100",{"path":6858,"stem":6859,"title":6860,"date":6520,"chapterOrder":6861,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库","2100-0200",{"path":6863,"stem":6864,"title":6865,"date":6520,"chapterOrder":6866,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV计算机视觉库","2100-0300",{"path":6868,"stem":6869,"title":6870,"date":6520,"chapterOrder":6871,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库","2100-0400",{"path":6873,"stem":6874,"title":6875,"date":6520,"chapterOrder":6876,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代数库","2100-0500",{"path":6878,"stem":6879,"title":6880,"date":6520,"chapterOrder":6881,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习","2100",{"path":6883,"stem":6884,"title":6885,"date":6520,"chapterOrder":6886,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装","2200-0100",{"path":6888,"stem":6889,"title":6890,"date":6520,"chapterOrder":6891,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","顶层CMake与公共编译选项","2200-0200",{"path":6893,"stem":6894,"title":6895,"date":6520,"chapterOrder":6896,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src与lib模块CMake详解","2200-0300",{"path":6898,"stem":6899,"title":6900,"date":6520,"chapterOrder":6901,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法","2200-0400",{"path":6903,"stem":6904,"title":6905,"date":6520,"chapterOrder":6906,"chapterDepth":113,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板扩展与常见问题","2200-0500",{"path":6908,"stem":6909,"title":6910,"date":6520,"chapterOrder":6911,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":6525},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":6522,"stem":6913,"title":6914,"date":6520,"chapterOrder":6915,"chapterDepth":6518,"docKey":6521,"docRoot":6522,"docTitle":6523,"isWikiDoc":200,"isWikiIndex":200},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",null,1784505233316]