[{"data":1,"prerenderedAt":3383},["ShallowReactive",2],{"page-\u002Frust\u002F18-error-handling":3},{"id":4,"title":5,"body":6,"description":3376,"extension":3377,"meta":3378,"navigation":1326,"path":3379,"seo":3380,"stem":3381,"__hash__":3382},"content\u002Frust\u002F18-error-handling.md","18 — Error Handling",{"type":7,"value":8,"toc":3336},"minimark",[9,13,35,43,95,101,202,209,254,390,398,403,502,507,562,571,580,640,648,657,665,792,801,805,1100,1114,1121,1204,1231,1235,1239,1781,1788,1912,1931,1938,2070,2076,2083,2183,2192,2196,2221,2228,2232,2263,2272,2405,2411,2696,2700,2816,2823,2829,2839,2846,2965,2973,2977,3015,3023,3059,3065,3069,3253,3257,3298,3302,3329,3332],[10,11,5],"h1",{"id":12},"_18-error-handling",[14,15,16,17,21,22,26,27,30,31,34],"p",{},"Rust's error handling is a defining strength. There's no exceptions, no ",[18,19,20],"code",{},"null",". Errors are ",[23,24,25],"strong",{},"values"," (",[18,28,29],{},"Result","\u002F",[18,32,33],{},"Option",") and the type system forces you to handle them.",[36,37,39,42],"h2",{"id":38},"optiont-absence",[18,40,41],{},"Option\u003CT>"," — Absence",[44,45,47],"code-wrapper",{"language":46},"rust",[48,49,53],"pre",{"className":50,"code":51,"language":46,"meta":52,"style":52},"language-rust shiki shiki-themes github-light github-dark","enum Option\u003CT> { Some(T), None }\n","",[18,54,55],{"__ignoreMap":52},[56,57,60,64,68,72,75,78,81,84,86,89,92],"span",{"class":58,"line":59},"line",1,[56,61,63],{"class":62},"svdQ7","enum",[56,65,67],{"class":66},"sIsaT"," Option",[56,69,71],{"class":70},"ssxIu","\u003C",[56,73,74],{"class":66},"T",[56,76,77],{"class":70},"> { ",[56,79,80],{"class":66},"Some",[56,82,83],{"class":70},"(",[56,85,74],{"class":66},[56,87,88],{"class":70},"), ",[56,90,91],{"class":66},"None",[56,93,94],{"class":70}," }\n",[14,96,97,98,100],{},"Use when a value is logically absent. The compiler forces you to handle ",[18,99,91],{},":",[44,102,103],{"language":46},[48,104,106],{"className":50,"code":105,"language":46,"meta":52,"style":52},"let v: Option\u003Ci32> = Some(5);\nlet s = match v { Some(x) => x.to_string(), None => String::from(\"none\") };\n",[18,107,108,143],{"__ignoreMap":52},[56,109,110,113,116,118,120,122,125,128,131,134,136,140],{"class":58,"line":59},[56,111,112],{"class":62},"let",[56,114,115],{"class":70}," v",[56,117,100],{"class":62},[56,119,67],{"class":66},[56,121,71],{"class":70},[56,123,124],{"class":66},"i32",[56,126,127],{"class":70},"> ",[56,129,130],{"class":62},"=",[56,132,133],{"class":66}," Some",[56,135,83],{"class":70},[56,137,139],{"class":138},"snvgF","5",[56,141,142],{"class":70},");\n",[56,144,146,148,151,153,156,159,161,164,167,170,173,176,179,181,184,187,190,193,195,199],{"class":58,"line":145},2,[56,147,112],{"class":62},[56,149,150],{"class":70}," s ",[56,152,130],{"class":62},[56,154,155],{"class":62}," match",[56,157,158],{"class":70}," v { ",[56,160,80],{"class":66},[56,162,163],{"class":70},"(x) ",[56,165,166],{"class":62},"=>",[56,168,169],{"class":70}," x",[56,171,172],{"class":62},".",[56,174,175],{"class":66},"to_string",[56,177,178],{"class":70},"(), ",[56,180,91],{"class":66},[56,182,183],{"class":62}," =>",[56,185,186],{"class":66}," String",[56,188,189],{"class":62},"::",[56,191,192],{"class":66},"from",[56,194,83],{"class":70},[56,196,198],{"class":197},"sJ6F3","\"none\"",[56,200,201],{"class":70},") };\n",[36,203,205,208],{"id":204},"resultt-e-recoverable-errors",[18,206,207],{},"Result\u003CT, E>"," — Recoverable Errors",[44,210,211],{"language":46},[48,212,214],{"className":50,"code":213,"language":46,"meta":52,"style":52},"enum Result\u003CT, E> { Ok(T), Err(E) }\n",[18,215,216],{"__ignoreMap":52},[56,217,218,220,223,225,227,230,233,235,238,240,242,244,247,249,251],{"class":58,"line":59},[56,219,63],{"class":62},[56,221,222],{"class":66}," Result",[56,224,71],{"class":70},[56,226,74],{"class":66},[56,228,229],{"class":70},", ",[56,231,232],{"class":66},"E",[56,234,77],{"class":70},[56,236,237],{"class":66},"Ok",[56,239,83],{"class":70},[56,241,74],{"class":66},[56,243,88],{"class":70},[56,245,246],{"class":66},"Err",[56,248,83],{"class":70},[56,250,232],{"class":66},[56,252,253],{"class":70},") }\n",[44,255,256],{"language":46},[48,257,259],{"className":50,"code":258,"language":46,"meta":52,"style":52},"fn parse(s: &str) -> Result\u003Ci32, std::num::ParseIntError> {\n    s.parse()\n}\nmatch parse(\"42\") {\n    Ok(n) => println!(\"{n}\"),\n    Err(e) => println!(\"err: {e}\"),\n}\n",[18,260,261,308,321,327,343,365,385],{"__ignoreMap":52},[56,262,263,266,269,272,274,277,280,283,286,288,290,292,295,297,300,302,305],{"class":58,"line":59},[56,264,265],{"class":62},"fn",[56,267,268],{"class":66}," parse",[56,270,271],{"class":70},"(s",[56,273,100],{"class":62},[56,275,276],{"class":62}," &",[56,278,279],{"class":66},"str",[56,281,282],{"class":70},") ",[56,284,285],{"class":62},"->",[56,287,222],{"class":66},[56,289,71],{"class":70},[56,291,124],{"class":66},[56,293,294],{"class":70},", std",[56,296,189],{"class":62},[56,298,299],{"class":70},"num",[56,301,189],{"class":62},[56,303,304],{"class":66},"ParseIntError",[56,306,307],{"class":70},"> {\n",[56,309,310,313,315,318],{"class":58,"line":145},[56,311,312],{"class":70},"    s",[56,314,172],{"class":62},[56,316,317],{"class":66},"parse",[56,319,320],{"class":70},"()\n",[56,322,324],{"class":58,"line":323},3,[56,325,326],{"class":70},"}\n",[56,328,330,333,335,337,340],{"class":58,"line":329},4,[56,331,332],{"class":62},"match",[56,334,268],{"class":66},[56,336,83],{"class":70},[56,338,339],{"class":197},"\"42\"",[56,341,342],{"class":70},") {\n",[56,344,346,349,352,354,357,359,362],{"class":58,"line":345},5,[56,347,348],{"class":66},"    Ok",[56,350,351],{"class":70},"(n) ",[56,353,166],{"class":62},[56,355,356],{"class":66}," println!",[56,358,83],{"class":70},[56,360,361],{"class":197},"\"{n}\"",[56,363,364],{"class":70},"),\n",[56,366,368,371,374,376,378,380,383],{"class":58,"line":367},6,[56,369,370],{"class":66},"    Err",[56,372,373],{"class":70},"(e) ",[56,375,166],{"class":62},[56,377,356],{"class":66},[56,379,83],{"class":70},[56,381,382],{"class":197},"\"err: {e}\"",[56,384,364],{"class":70},[56,386,388],{"class":58,"line":387},7,[56,389,326],{"class":70},[36,391,393,394,397],{"id":392},"the-operator","The ",[18,395,396],{},"?"," Operator",[14,399,400,401,100],{},"Short-circuits on error, propagating ",[18,402,246],{},[44,404,405],{"language":46},[48,406,408],{"className":50,"code":407,"language":46,"meta":52,"style":52},"fn parse_and_double(s: &str) -> Result\u003Ci32, std::num::ParseIntError> {\n    let n: i32 = s.parse()?;     \u002F\u002F returns Err on failure\n    Ok(n * 2)\n}\n",[18,409,410,447,482,498],{"__ignoreMap":52},[56,411,412,414,417,419,421,423,425,427,429,431,433,435,437,439,441,443,445],{"class":58,"line":59},[56,413,265],{"class":62},[56,415,416],{"class":66}," parse_and_double",[56,418,271],{"class":70},[56,420,100],{"class":62},[56,422,276],{"class":62},[56,424,279],{"class":66},[56,426,282],{"class":70},[56,428,285],{"class":62},[56,430,222],{"class":66},[56,432,71],{"class":70},[56,434,124],{"class":66},[56,436,294],{"class":70},[56,438,189],{"class":62},[56,440,299],{"class":70},[56,442,189],{"class":62},[56,444,304],{"class":66},[56,446,307],{"class":70},[56,448,449,452,455,457,460,463,466,468,470,473,475,478],{"class":58,"line":145},[56,450,451],{"class":62},"    let",[56,453,454],{"class":70}," n",[56,456,100],{"class":62},[56,458,459],{"class":66}," i32",[56,461,462],{"class":62}," =",[56,464,465],{"class":70}," s",[56,467,172],{"class":62},[56,469,317],{"class":66},[56,471,472],{"class":70},"()",[56,474,396],{"class":62},[56,476,477],{"class":70},";     ",[56,479,481],{"class":480},"sdCPZ","\u002F\u002F returns Err on failure\n",[56,483,484,486,489,492,495],{"class":58,"line":323},[56,485,348],{"class":66},[56,487,488],{"class":70},"(n ",[56,490,491],{"class":62},"*",[56,493,494],{"class":138}," 2",[56,496,497],{"class":70},")\n",[56,499,500],{"class":58,"line":329},[56,501,326],{"class":70},[14,503,504,506],{},[18,505,396],{}," desugars roughly to:",[44,508,509],{"language":46},[48,510,512],{"className":50,"code":511,"language":46,"meta":52,"style":52},"match expr {\n    Ok(v) => v,\n    Err(e) => return Err(e.into()),\n}\n",[18,513,514,521,533,558],{"__ignoreMap":52},[56,515,516,518],{"class":58,"line":59},[56,517,332],{"class":62},[56,519,520],{"class":70}," expr {\n",[56,522,523,525,528,530],{"class":58,"line":145},[56,524,348],{"class":66},[56,526,527],{"class":70},"(v) ",[56,529,166],{"class":62},[56,531,532],{"class":70}," v,\n",[56,534,535,537,539,541,544,547,550,552,555],{"class":58,"line":323},[56,536,370],{"class":66},[56,538,373],{"class":70},[56,540,166],{"class":62},[56,542,543],{"class":62}," return",[56,545,546],{"class":66}," Err",[56,548,549],{"class":70},"(e",[56,551,172],{"class":62},[56,553,554],{"class":66},"into",[56,556,557],{"class":70},"()),\n",[56,559,560],{"class":58,"line":329},[56,561,326],{"class":70},[14,563,564,565,568,569,172],{},"It uses ",[18,566,567],{},"From"," to convert errors, so you can mix error types if they implement ",[18,570,567],{},[572,573,575,577,578],"h3",{"id":574},"on-option",[18,576,396],{}," on ",[18,579,33],{},[44,581,582],{"language":46},[48,583,585],{"className":50,"code":584,"language":46,"meta":52,"style":52},"fn first_char(s: &str) -> Option\u003Cchar> {\n    s.chars().next()?\n}\n",[18,586,587,615,636],{"__ignoreMap":52},[56,588,589,591,594,596,598,600,602,604,606,608,610,613],{"class":58,"line":59},[56,590,265],{"class":62},[56,592,593],{"class":66}," first_char",[56,595,271],{"class":70},[56,597,100],{"class":62},[56,599,276],{"class":62},[56,601,279],{"class":66},[56,603,282],{"class":70},[56,605,285],{"class":62},[56,607,67],{"class":66},[56,609,71],{"class":70},[56,611,612],{"class":66},"char",[56,614,307],{"class":70},[56,616,617,619,621,624,626,628,631,633],{"class":58,"line":145},[56,618,312],{"class":70},[56,620,172],{"class":62},[56,622,623],{"class":66},"chars",[56,625,472],{"class":70},[56,627,172],{"class":62},[56,629,630],{"class":66},"next",[56,632,472],{"class":70},[56,634,635],{"class":62},"?\n",[56,637,638],{"class":58,"line":323},[56,639,326],{"class":70},[14,641,642,643,645,646,172],{},"Returns ",[18,644,91],{}," if the inner is ",[18,647,91],{},[572,649,651,653,654],{"id":650},"in-main",[18,652,396],{}," in ",[18,655,656],{},"main",[14,658,659,660,662,663,100],{},"Since Rust 1.56, ",[18,661,656],{}," can return ",[18,664,29],{},[44,666,667],{"language":46},[48,668,670],{"className":50,"code":669,"language":46,"meta":52,"style":52},"fn main() -> Result\u003C(), Box\u003Cdyn std::error::Error>> {\n    let n: i32 = std::env::args().nth(1).unwrap().parse()?;\n    println!(\"{n}\");\n    Ok(())\n}\n",[18,671,672,713,770,781,788],{"__ignoreMap":52},[56,673,674,676,679,682,684,686,689,692,694,697,700,702,705,707,710],{"class":58,"line":59},[56,675,265],{"class":62},[56,677,678],{"class":66}," main",[56,680,681],{"class":70},"() ",[56,683,285],{"class":62},[56,685,222],{"class":66},[56,687,688],{"class":70},"\u003C(), ",[56,690,691],{"class":66},"Box",[56,693,71],{"class":70},[56,695,696],{"class":62},"dyn",[56,698,699],{"class":70}," std",[56,701,189],{"class":62},[56,703,704],{"class":70},"error",[56,706,189],{"class":62},[56,708,709],{"class":66},"Error",[56,711,712],{"class":70},">> {\n",[56,714,715,717,719,721,723,725,727,729,732,734,737,739,741,744,746,749,752,754,757,759,761,763,765,767],{"class":58,"line":145},[56,716,451],{"class":62},[56,718,454],{"class":70},[56,720,100],{"class":62},[56,722,459],{"class":66},[56,724,462],{"class":62},[56,726,699],{"class":66},[56,728,189],{"class":62},[56,730,731],{"class":66},"env",[56,733,189],{"class":62},[56,735,736],{"class":66},"args",[56,738,472],{"class":70},[56,740,172],{"class":62},[56,742,743],{"class":66},"nth",[56,745,83],{"class":70},[56,747,748],{"class":138},"1",[56,750,751],{"class":70},")",[56,753,172],{"class":62},[56,755,756],{"class":66},"unwrap",[56,758,472],{"class":70},[56,760,172],{"class":62},[56,762,317],{"class":66},[56,764,472],{"class":70},[56,766,396],{"class":62},[56,768,769],{"class":70},";\n",[56,771,772,775,777,779],{"class":58,"line":323},[56,773,774],{"class":66},"    println!",[56,776,83],{"class":70},[56,778,361],{"class":197},[56,780,142],{"class":70},[56,782,783,785],{"class":58,"line":329},[56,784,348],{"class":66},[56,786,787],{"class":70},"(())\n",[56,789,790],{"class":58,"line":345},[56,791,326],{"class":70},[14,793,794,795,797,798,800],{},"If ",[18,796,656],{}," returns ",[18,799,246],{},", the program exits with code 1 and prints the error.",[36,802,804],{"id":803},"recovering-values","Recovering Values",[44,806,807],{"language":46},[48,808,810],{"className":50,"code":809,"language":46,"meta":52,"style":52},"let v = opt.unwrap();          \u002F\u002F panics on None\nlet v = opt.expect(\"msg\");      \u002F\u002F panics with custom msg\nlet v = opt.unwrap_or(default);\nlet v = opt.unwrap_or_default();\nlet v = opt.unwrap_or_else(|| expensive());\nlet v = opt.map(|x| x + 1);   \u002F\u002F Option\u003COption\u003C...>> sometimes\nlet v = opt.and_then(|x| Some(x + 1));   \u002F\u002F flatten\nlet v = opt.or(Some(0));\nlet v = opt.or_else(|| Some(0));\nlet v = opt.get_or_insert(0);\nlet v = opt.take();             \u002F\u002F leaves None in opt\n",[18,811,812,834,860,878,896,922,962,1000,1028,1056,1078],{"__ignoreMap":52},[56,813,814,816,819,821,824,826,828,831],{"class":58,"line":59},[56,815,112],{"class":62},[56,817,818],{"class":70}," v ",[56,820,130],{"class":62},[56,822,823],{"class":70}," opt",[56,825,172],{"class":62},[56,827,756],{"class":66},[56,829,830],{"class":70},"();          ",[56,832,833],{"class":480},"\u002F\u002F panics on None\n",[56,835,836,838,840,842,844,846,849,851,854,857],{"class":58,"line":145},[56,837,112],{"class":62},[56,839,818],{"class":70},[56,841,130],{"class":62},[56,843,823],{"class":70},[56,845,172],{"class":62},[56,847,848],{"class":66},"expect",[56,850,83],{"class":70},[56,852,853],{"class":197},"\"msg\"",[56,855,856],{"class":70},");      ",[56,858,859],{"class":480},"\u002F\u002F panics with custom msg\n",[56,861,862,864,866,868,870,872,875],{"class":58,"line":323},[56,863,112],{"class":62},[56,865,818],{"class":70},[56,867,130],{"class":62},[56,869,823],{"class":70},[56,871,172],{"class":62},[56,873,874],{"class":66},"unwrap_or",[56,876,877],{"class":70},"(default);\n",[56,879,880,882,884,886,888,890,893],{"class":58,"line":329},[56,881,112],{"class":62},[56,883,818],{"class":70},[56,885,130],{"class":62},[56,887,823],{"class":70},[56,889,172],{"class":62},[56,891,892],{"class":66},"unwrap_or_default",[56,894,895],{"class":70},"();\n",[56,897,898,900,902,904,906,908,911,913,916,919],{"class":58,"line":345},[56,899,112],{"class":62},[56,901,818],{"class":70},[56,903,130],{"class":62},[56,905,823],{"class":70},[56,907,172],{"class":62},[56,909,910],{"class":66},"unwrap_or_else",[56,912,83],{"class":70},[56,914,915],{"class":62},"||",[56,917,918],{"class":66}," expensive",[56,920,921],{"class":70},"());\n",[56,923,924,926,928,930,932,934,937,939,942,945,947,950,953,956,959],{"class":58,"line":367},[56,925,112],{"class":62},[56,927,818],{"class":70},[56,929,130],{"class":62},[56,931,823],{"class":70},[56,933,172],{"class":62},[56,935,936],{"class":66},"map",[56,938,83],{"class":70},[56,940,941],{"class":62},"|",[56,943,944],{"class":70},"x",[56,946,941],{"class":62},[56,948,949],{"class":70}," x ",[56,951,952],{"class":62},"+",[56,954,955],{"class":138}," 1",[56,957,958],{"class":70},");   ",[56,960,961],{"class":480},"\u002F\u002F Option\u003COption\u003C...>> sometimes\n",[56,963,964,966,968,970,972,974,977,979,981,983,985,987,990,992,994,997],{"class":58,"line":387},[56,965,112],{"class":62},[56,967,818],{"class":70},[56,969,130],{"class":62},[56,971,823],{"class":70},[56,973,172],{"class":62},[56,975,976],{"class":66},"and_then",[56,978,83],{"class":70},[56,980,941],{"class":62},[56,982,944],{"class":70},[56,984,941],{"class":62},[56,986,133],{"class":66},[56,988,989],{"class":70},"(x ",[56,991,952],{"class":62},[56,993,955],{"class":138},[56,995,996],{"class":70},"));   ",[56,998,999],{"class":480},"\u002F\u002F flatten\n",[56,1001,1003,1005,1007,1009,1011,1013,1016,1018,1020,1022,1025],{"class":58,"line":1002},8,[56,1004,112],{"class":62},[56,1006,818],{"class":70},[56,1008,130],{"class":62},[56,1010,823],{"class":70},[56,1012,172],{"class":62},[56,1014,1015],{"class":66},"or",[56,1017,83],{"class":70},[56,1019,80],{"class":66},[56,1021,83],{"class":70},[56,1023,1024],{"class":138},"0",[56,1026,1027],{"class":70},"));\n",[56,1029,1031,1033,1035,1037,1039,1041,1044,1046,1048,1050,1052,1054],{"class":58,"line":1030},9,[56,1032,112],{"class":62},[56,1034,818],{"class":70},[56,1036,130],{"class":62},[56,1038,823],{"class":70},[56,1040,172],{"class":62},[56,1042,1043],{"class":66},"or_else",[56,1045,83],{"class":70},[56,1047,915],{"class":62},[56,1049,133],{"class":66},[56,1051,83],{"class":70},[56,1053,1024],{"class":138},[56,1055,1027],{"class":70},[56,1057,1059,1061,1063,1065,1067,1069,1072,1074,1076],{"class":58,"line":1058},10,[56,1060,112],{"class":62},[56,1062,818],{"class":70},[56,1064,130],{"class":62},[56,1066,823],{"class":70},[56,1068,172],{"class":62},[56,1070,1071],{"class":66},"get_or_insert",[56,1073,83],{"class":70},[56,1075,1024],{"class":138},[56,1077,142],{"class":70},[56,1079,1081,1083,1085,1087,1089,1091,1094,1097],{"class":58,"line":1080},11,[56,1082,112],{"class":62},[56,1084,818],{"class":70},[56,1086,130],{"class":62},[56,1088,823],{"class":70},[56,1090,172],{"class":62},[56,1092,1093],{"class":66},"take",[56,1095,1096],{"class":70},"();             ",[56,1098,1099],{"class":480},"\u002F\u002F leaves None in opt\n",[14,1101,1102,1103,1105,1106,229,1109,229,1111,1113],{},"Same combinator suite exists for ",[18,1104,29],{}," (with ",[18,1107,1108],{},"map_err",[18,1110,936],{},[18,1112,976],{},", etc.).",[36,1115,393,1117,1120],{"id":1116},"the-stderrorerror-trait",[18,1118,1119],{},"std::error::Error"," Trait",[44,1122,1123],{"language":46},[48,1124,1126],{"className":50,"code":1125,"language":46,"meta":52,"style":52},"pub trait Error: Debug + Display {\n    fn source(&self) -> Option\u003C&(dyn Error + 'static)> { None }\n}\n",[18,1127,1128,1153,1200],{"__ignoreMap":52},[56,1129,1130,1133,1136,1139,1141,1144,1147,1150],{"class":58,"line":59},[56,1131,1132],{"class":62},"pub",[56,1134,1135],{"class":62}," trait",[56,1137,1138],{"class":66}," Error",[56,1140,100],{"class":62},[56,1142,1143],{"class":66}," Debug",[56,1145,1146],{"class":62}," +",[56,1148,1149],{"class":66}," Display",[56,1151,1152],{"class":70}," {\n",[56,1154,1155,1158,1161,1163,1166,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1190,1193,1196,1198],{"class":58,"line":145},[56,1156,1157],{"class":62},"    fn",[56,1159,1160],{"class":66}," source",[56,1162,83],{"class":70},[56,1164,1165],{"class":62},"&",[56,1167,1168],{"class":138},"self",[56,1170,282],{"class":70},[56,1172,285],{"class":62},[56,1174,67],{"class":66},[56,1176,71],{"class":70},[56,1178,1165],{"class":62},[56,1180,83],{"class":70},[56,1182,696],{"class":62},[56,1184,1138],{"class":66},[56,1186,1146],{"class":62},[56,1188,1189],{"class":70}," '",[56,1191,1192],{"class":66},"static",[56,1194,1195],{"class":70},")> { ",[56,1197,91],{"class":66},[56,1199,94],{"class":70},[56,1201,1202],{"class":58,"line":323},[56,1203,326],{"class":70},[14,1205,1206,1207,1209,1210,1213,1214,1216,1217,1219,1220,30,1223,1226,1227,1230],{},"A type implementing ",[18,1208,709],{}," can be used with ",[18,1211,1212],{},"Result\u003C_, MyError>",", chained with ",[18,1215,396],{}," (via ",[18,1218,567],{},"), and printed with ",[18,1221,1222],{},"{:?}",[18,1224,1225],{},"{}",". The ",[18,1228,1229],{},"source"," method gives an error chain.",[36,1232,1234],{"id":1233},"defining-your-own-error-type","Defining Your Own Error Type",[572,1236,1238],{"id":1237},"the-manual-way","The Manual Way",[44,1240,1241],{"language":46},[48,1242,1244],{"className":50,"code":1243,"language":46,"meta":52,"style":52},"#[derive(Debug)]\nenum AppError {\n    Io(std::io::Error),\n    Parse(std::num::ParseIntError),\n    Custom(String),\n}\n\nimpl std::fmt::Display for AppError {\n    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {\n        match self {\n            AppError::Io(e) => write!(f, \"io: {e}\"),\n            AppError::Parse(e) => write!(f, \"parse: {e}\"),\n            AppError::Custom(s) => write!(f, \"{s}\"),\n        }\n    }\n}\n\nimpl std::error::Error for AppError {\n    fn source(&self) -> Option\u003C&(dyn std::error::Error + 'static)> {\n        match self {\n            AppError::Io(e) => Some(e),\n            AppError::Parse(e) => Some(e),\n            AppError::Custom(_) => None,\n        }\n    }\n}\n\nimpl From\u003Cstd::io::Error> for AppError { fn from(e: std::io::Error) -> Self { AppError::Io(e) } }\nimpl From\u003Cstd::num::ParseIntError> for AppError { fn from(e: std::num::ParseIntError) -> Self { AppError::Parse(e) } }\n",[18,1245,1246,1257,1266,1287,1306,1318,1322,1328,1352,1400,1410,1435,1458,1482,1488,1494,1499,1504,1525,1571,1580,1598,1615,1635,1640,1645,1650,1655,1722],{"__ignoreMap":52},[56,1247,1248,1251,1254],{"class":58,"line":59},[56,1249,1250],{"class":70},"#[derive(",[56,1252,1253],{"class":66},"Debug",[56,1255,1256],{"class":70},")]\n",[56,1258,1259,1261,1264],{"class":58,"line":145},[56,1260,63],{"class":62},[56,1262,1263],{"class":66}," AppError",[56,1265,1152],{"class":70},[56,1267,1268,1271,1273,1276,1278,1281,1283,1285],{"class":58,"line":323},[56,1269,1270],{"class":66},"    Io",[56,1272,83],{"class":70},[56,1274,1275],{"class":66},"std",[56,1277,189],{"class":62},[56,1279,1280],{"class":66},"io",[56,1282,189],{"class":62},[56,1284,709],{"class":66},[56,1286,364],{"class":70},[56,1288,1289,1292,1294,1296,1298,1300,1302,1304],{"class":58,"line":329},[56,1290,1291],{"class":66},"    Parse",[56,1293,83],{"class":70},[56,1295,1275],{"class":66},[56,1297,189],{"class":62},[56,1299,299],{"class":66},[56,1301,189],{"class":62},[56,1303,304],{"class":66},[56,1305,364],{"class":70},[56,1307,1308,1311,1313,1316],{"class":58,"line":345},[56,1309,1310],{"class":66},"    Custom",[56,1312,83],{"class":70},[56,1314,1315],{"class":66},"String",[56,1317,364],{"class":70},[56,1319,1320],{"class":58,"line":367},[56,1321,326],{"class":70},[56,1323,1324],{"class":58,"line":387},[56,1325,1327],{"emptyLinePlaceholder":1326},true,"\n",[56,1329,1330,1333,1335,1337,1340,1342,1345,1348,1350],{"class":58,"line":1002},[56,1331,1332],{"class":62},"impl",[56,1334,699],{"class":66},[56,1336,189],{"class":62},[56,1338,1339],{"class":66},"fmt",[56,1341,189],{"class":62},[56,1343,1344],{"class":66},"Display",[56,1346,1347],{"class":62}," for",[56,1349,1263],{"class":66},[56,1351,1152],{"class":70},[56,1353,1354,1356,1359,1361,1363,1365,1368,1370,1373,1375,1377,1379,1381,1384,1386,1388,1390,1392,1394,1396,1398],{"class":58,"line":1030},[56,1355,1157],{"class":62},[56,1357,1358],{"class":66}," fmt",[56,1360,83],{"class":70},[56,1362,1165],{"class":62},[56,1364,1168],{"class":138},[56,1366,1367],{"class":70},", f",[56,1369,100],{"class":62},[56,1371,1372],{"class":62}," &mut",[56,1374,699],{"class":66},[56,1376,189],{"class":62},[56,1378,1339],{"class":66},[56,1380,189],{"class":62},[56,1382,1383],{"class":66},"Formatter",[56,1385,282],{"class":70},[56,1387,285],{"class":62},[56,1389,699],{"class":66},[56,1391,189],{"class":62},[56,1393,1339],{"class":66},[56,1395,189],{"class":62},[56,1397,29],{"class":66},[56,1399,1152],{"class":70},[56,1401,1402,1405,1408],{"class":58,"line":1058},[56,1403,1404],{"class":62},"        match",[56,1406,1407],{"class":138}," self",[56,1409,1152],{"class":70},[56,1411,1412,1415,1417,1420,1422,1424,1427,1430,1433],{"class":58,"line":1080},[56,1413,1414],{"class":66},"            AppError",[56,1416,189],{"class":62},[56,1418,1419],{"class":66},"Io",[56,1421,373],{"class":70},[56,1423,166],{"class":62},[56,1425,1426],{"class":66}," write!",[56,1428,1429],{"class":70},"(f, ",[56,1431,1432],{"class":197},"\"io: {e}\"",[56,1434,364],{"class":70},[56,1436,1438,1440,1442,1445,1447,1449,1451,1453,1456],{"class":58,"line":1437},12,[56,1439,1414],{"class":66},[56,1441,189],{"class":62},[56,1443,1444],{"class":66},"Parse",[56,1446,373],{"class":70},[56,1448,166],{"class":62},[56,1450,1426],{"class":66},[56,1452,1429],{"class":70},[56,1454,1455],{"class":197},"\"parse: {e}\"",[56,1457,364],{"class":70},[56,1459,1461,1463,1465,1468,1471,1473,1475,1477,1480],{"class":58,"line":1460},13,[56,1462,1414],{"class":66},[56,1464,189],{"class":62},[56,1466,1467],{"class":66},"Custom",[56,1469,1470],{"class":70},"(s) ",[56,1472,166],{"class":62},[56,1474,1426],{"class":66},[56,1476,1429],{"class":70},[56,1478,1479],{"class":197},"\"{s}\"",[56,1481,364],{"class":70},[56,1483,1485],{"class":58,"line":1484},14,[56,1486,1487],{"class":70},"        }\n",[56,1489,1491],{"class":58,"line":1490},15,[56,1492,1493],{"class":70},"    }\n",[56,1495,1497],{"class":58,"line":1496},16,[56,1498,326],{"class":70},[56,1500,1502],{"class":58,"line":1501},17,[56,1503,1327],{"emptyLinePlaceholder":1326},[56,1505,1507,1509,1511,1513,1515,1517,1519,1521,1523],{"class":58,"line":1506},18,[56,1508,1332],{"class":62},[56,1510,699],{"class":66},[56,1512,189],{"class":62},[56,1514,704],{"class":66},[56,1516,189],{"class":62},[56,1518,709],{"class":66},[56,1520,1347],{"class":62},[56,1522,1263],{"class":66},[56,1524,1152],{"class":70},[56,1526,1528,1530,1532,1534,1536,1538,1540,1542,1544,1546,1548,1550,1552,1554,1556,1558,1560,1562,1564,1566,1568],{"class":58,"line":1527},19,[56,1529,1157],{"class":62},[56,1531,1160],{"class":66},[56,1533,83],{"class":70},[56,1535,1165],{"class":62},[56,1537,1168],{"class":138},[56,1539,282],{"class":70},[56,1541,285],{"class":62},[56,1543,67],{"class":66},[56,1545,71],{"class":70},[56,1547,1165],{"class":62},[56,1549,83],{"class":70},[56,1551,696],{"class":62},[56,1553,699],{"class":70},[56,1555,189],{"class":62},[56,1557,704],{"class":70},[56,1559,189],{"class":62},[56,1561,709],{"class":66},[56,1563,1146],{"class":62},[56,1565,1189],{"class":70},[56,1567,1192],{"class":66},[56,1569,1570],{"class":70},")> {\n",[56,1572,1574,1576,1578],{"class":58,"line":1573},20,[56,1575,1404],{"class":62},[56,1577,1407],{"class":138},[56,1579,1152],{"class":70},[56,1581,1583,1585,1587,1589,1591,1593,1595],{"class":58,"line":1582},21,[56,1584,1414],{"class":66},[56,1586,189],{"class":62},[56,1588,1419],{"class":66},[56,1590,373],{"class":70},[56,1592,166],{"class":62},[56,1594,133],{"class":66},[56,1596,1597],{"class":70},"(e),\n",[56,1599,1601,1603,1605,1607,1609,1611,1613],{"class":58,"line":1600},22,[56,1602,1414],{"class":66},[56,1604,189],{"class":62},[56,1606,1444],{"class":66},[56,1608,373],{"class":70},[56,1610,166],{"class":62},[56,1612,133],{"class":66},[56,1614,1597],{"class":70},[56,1616,1618,1620,1622,1624,1627,1629,1632],{"class":58,"line":1617},23,[56,1619,1414],{"class":66},[56,1621,189],{"class":62},[56,1623,1467],{"class":66},[56,1625,1626],{"class":70},"(_) ",[56,1628,166],{"class":62},[56,1630,1631],{"class":66}," None",[56,1633,1634],{"class":70},",\n",[56,1636,1638],{"class":58,"line":1637},24,[56,1639,1487],{"class":70},[56,1641,1643],{"class":58,"line":1642},25,[56,1644,1493],{"class":70},[56,1646,1648],{"class":58,"line":1647},26,[56,1649,326],{"class":70},[56,1651,1653],{"class":58,"line":1652},27,[56,1654,1327],{"emptyLinePlaceholder":1326},[56,1656,1658,1660,1663,1666,1668,1670,1672,1674,1676,1679,1681,1684,1686,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1710,1712,1715,1717,1719],{"class":58,"line":1657},28,[56,1659,1332],{"class":62},[56,1661,1662],{"class":66}," From",[56,1664,1665],{"class":70},"\u003Cstd",[56,1667,189],{"class":62},[56,1669,1280],{"class":70},[56,1671,189],{"class":62},[56,1673,709],{"class":66},[56,1675,127],{"class":70},[56,1677,1678],{"class":62},"for",[56,1680,1263],{"class":66},[56,1682,1683],{"class":70}," { ",[56,1685,265],{"class":62},[56,1687,1688],{"class":66}," from",[56,1690,549],{"class":70},[56,1692,100],{"class":62},[56,1694,699],{"class":66},[56,1696,189],{"class":62},[56,1698,1280],{"class":66},[56,1700,189],{"class":62},[56,1702,709],{"class":66},[56,1704,282],{"class":70},[56,1706,285],{"class":62},[56,1708,1709],{"class":138}," Self",[56,1711,1683],{"class":70},[56,1713,1714],{"class":66},"AppError",[56,1716,189],{"class":62},[56,1718,1419],{"class":66},[56,1720,1721],{"class":70},"(e) } }\n",[56,1723,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779],{"class":58,"line":1724},29,[56,1726,1332],{"class":62},[56,1728,1662],{"class":66},[56,1730,1665],{"class":70},[56,1732,189],{"class":62},[56,1734,299],{"class":70},[56,1736,189],{"class":62},[56,1738,304],{"class":66},[56,1740,127],{"class":70},[56,1742,1678],{"class":62},[56,1744,1263],{"class":66},[56,1746,1683],{"class":70},[56,1748,265],{"class":62},[56,1750,1688],{"class":66},[56,1752,549],{"class":70},[56,1754,100],{"class":62},[56,1756,699],{"class":66},[56,1758,189],{"class":62},[56,1760,299],{"class":66},[56,1762,189],{"class":62},[56,1764,304],{"class":66},[56,1766,282],{"class":70},[56,1768,285],{"class":62},[56,1770,1709],{"class":138},[56,1772,1683],{"class":70},[56,1774,1714],{"class":66},[56,1776,189],{"class":62},[56,1778,1444],{"class":66},[56,1780,1721],{"class":70},[572,1782,393,1784,1787],{"id":1783},"the-thiserror-crate-idiomatic",[18,1785,1786],{},"thiserror"," Crate (idiomatic)",[44,1789,1790],{"language":46},[48,1791,1793],{"className":50,"code":1792,"language":46,"meta":52,"style":52},"use thiserror::Error;\n\n#[derive(Debug, Error)]\nenum AppError {\n    #[error(\"io: {0}\")]\n    Io(#[from] std::io::Error),\n    #[error(\"parse: {0}\")]\n    Parse(#[from] std::num::ParseIntError),\n    #[error(\"{0}\")]\n    Custom(String),\n}\n",[18,1794,1795,1809,1813,1825,1833,1843,1862,1871,1889,1898,1908],{"__ignoreMap":52},[56,1796,1797,1800,1803,1805,1807],{"class":58,"line":59},[56,1798,1799],{"class":62},"use",[56,1801,1802],{"class":66}," thiserror",[56,1804,189],{"class":62},[56,1806,709],{"class":66},[56,1808,769],{"class":70},[56,1810,1811],{"class":58,"line":145},[56,1812,1327],{"emptyLinePlaceholder":1326},[56,1814,1815,1817,1819,1821,1823],{"class":58,"line":323},[56,1816,1250],{"class":70},[56,1818,1253],{"class":66},[56,1820,229],{"class":70},[56,1822,709],{"class":66},[56,1824,1256],{"class":70},[56,1826,1827,1829,1831],{"class":58,"line":329},[56,1828,63],{"class":62},[56,1830,1263],{"class":66},[56,1832,1152],{"class":70},[56,1834,1835,1838,1841],{"class":58,"line":345},[56,1836,1837],{"class":70},"    #[error(",[56,1839,1840],{"class":197},"\"io: {0}\"",[56,1842,1256],{"class":70},[56,1844,1845,1847,1850,1852,1854,1856,1858,1860],{"class":58,"line":367},[56,1846,1270],{"class":66},[56,1848,1849],{"class":70},"(#[from] ",[56,1851,1275],{"class":66},[56,1853,189],{"class":62},[56,1855,1280],{"class":66},[56,1857,189],{"class":62},[56,1859,709],{"class":66},[56,1861,364],{"class":70},[56,1863,1864,1866,1869],{"class":58,"line":387},[56,1865,1837],{"class":70},[56,1867,1868],{"class":197},"\"parse: {0}\"",[56,1870,1256],{"class":70},[56,1872,1873,1875,1877,1879,1881,1883,1885,1887],{"class":58,"line":1002},[56,1874,1291],{"class":66},[56,1876,1849],{"class":70},[56,1878,1275],{"class":66},[56,1880,189],{"class":62},[56,1882,299],{"class":66},[56,1884,189],{"class":62},[56,1886,304],{"class":66},[56,1888,364],{"class":70},[56,1890,1891,1893,1896],{"class":58,"line":1030},[56,1892,1837],{"class":70},[56,1894,1895],{"class":197},"\"{0}\"",[56,1897,1256],{"class":70},[56,1899,1900,1902,1904,1906],{"class":58,"line":1058},[56,1901,1310],{"class":66},[56,1903,83],{"class":70},[56,1905,1315],{"class":66},[56,1907,364],{"class":70},[56,1909,1910],{"class":58,"line":1080},[56,1911,326],{"class":70},[14,1913,1914,1917,1918,1920,1921,1924,1925,1927,1928,1930],{},[18,1915,1916],{},"#[from]"," generates the ",[18,1919,567],{}," impl. ",[18,1922,1923],{},"#[error]"," generates ",[18,1926,1344],{},". Use ",[18,1929,1786],{}," for libraries.",[572,1932,393,1934,1937],{"id":1933},"the-anyhow-crate-applications",[18,1935,1936],{},"anyhow"," Crate (applications)",[44,1939,1940],{"language":46},[48,1941,1943],{"className":50,"code":1942,"language":46,"meta":52,"style":52},"use anyhow::{Context, Result};\n\nfn read_config(path: &str) -> Result\u003CConfig> {\n    let s = std::fs::read_to_string(path).with_context(|| format!(\"read {path}\"))?;\n    Ok(parse(&s)?)\n}\n",[18,1944,1945,1967,1971,2000,2047,2066],{"__ignoreMap":52},[56,1946,1947,1949,1952,1954,1957,1960,1962,1964],{"class":58,"line":59},[56,1948,1799],{"class":62},[56,1950,1951],{"class":66}," anyhow",[56,1953,189],{"class":62},[56,1955,1956],{"class":70},"{",[56,1958,1959],{"class":66},"Context",[56,1961,229],{"class":70},[56,1963,29],{"class":66},[56,1965,1966],{"class":70},"};\n",[56,1968,1969],{"class":58,"line":145},[56,1970,1327],{"emptyLinePlaceholder":1326},[56,1972,1973,1975,1978,1981,1983,1985,1987,1989,1991,1993,1995,1998],{"class":58,"line":323},[56,1974,265],{"class":62},[56,1976,1977],{"class":66}," read_config",[56,1979,1980],{"class":70},"(path",[56,1982,100],{"class":62},[56,1984,276],{"class":62},[56,1986,279],{"class":66},[56,1988,282],{"class":70},[56,1990,285],{"class":62},[56,1992,222],{"class":66},[56,1994,71],{"class":70},[56,1996,1997],{"class":66},"Config",[56,1999,307],{"class":70},[56,2001,2002,2004,2006,2008,2010,2012,2015,2017,2020,2023,2025,2028,2030,2032,2035,2037,2040,2043,2045],{"class":58,"line":329},[56,2003,451],{"class":62},[56,2005,150],{"class":70},[56,2007,130],{"class":62},[56,2009,699],{"class":66},[56,2011,189],{"class":62},[56,2013,2014],{"class":66},"fs",[56,2016,189],{"class":62},[56,2018,2019],{"class":66},"read_to_string",[56,2021,2022],{"class":70},"(path)",[56,2024,172],{"class":62},[56,2026,2027],{"class":66},"with_context",[56,2029,83],{"class":70},[56,2031,915],{"class":62},[56,2033,2034],{"class":66}," format!",[56,2036,83],{"class":70},[56,2038,2039],{"class":197},"\"read {path}\"",[56,2041,2042],{"class":70},"))",[56,2044,396],{"class":62},[56,2046,769],{"class":70},[56,2048,2049,2051,2053,2055,2057,2059,2062,2064],{"class":58,"line":345},[56,2050,348],{"class":66},[56,2052,83],{"class":70},[56,2054,317],{"class":66},[56,2056,83],{"class":70},[56,2058,1165],{"class":62},[56,2060,2061],{"class":70},"s)",[56,2063,396],{"class":62},[56,2065,497],{"class":70},[56,2067,2068],{"class":58,"line":367},[56,2069,326],{"class":70},[14,2071,2072,2075],{},[18,2073,2074],{},"anyhow::Error"," is a boxed trait object with backtraces and context. Perfect for application code where you just want errors to bubble up with context.",[36,2077,2079,2082],{"id":2078},"panic-unrecoverable",[18,2080,2081],{},"panic!"," — Unrecoverable",[44,2084,2085],{"language":46},[48,2086,2088],{"className":50,"code":2087,"language":46,"meta":52,"style":52},"panic!(\"cannot continue\");\nunreachable!(\"documented unreachable\");\nunimplemented!(\"todo\");\ntodo!(\"later\");\nassert!(x > 0);\nassert_eq!(a, b);\nassert_ne!(a, b);\ndebug_assert!(x > 0);   \u002F\u002F only in debug builds\n",[18,2089,2090,2101,2113,2125,2137,2152,2160,2167],{"__ignoreMap":52},[56,2091,2092,2094,2096,2099],{"class":58,"line":59},[56,2093,2081],{"class":66},[56,2095,83],{"class":70},[56,2097,2098],{"class":197},"\"cannot continue\"",[56,2100,142],{"class":70},[56,2102,2103,2106,2108,2111],{"class":58,"line":145},[56,2104,2105],{"class":66},"unreachable!",[56,2107,83],{"class":70},[56,2109,2110],{"class":197},"\"documented unreachable\"",[56,2112,142],{"class":70},[56,2114,2115,2118,2120,2123],{"class":58,"line":323},[56,2116,2117],{"class":66},"unimplemented!",[56,2119,83],{"class":70},[56,2121,2122],{"class":197},"\"todo\"",[56,2124,142],{"class":70},[56,2126,2127,2130,2132,2135],{"class":58,"line":329},[56,2128,2129],{"class":66},"todo!",[56,2131,83],{"class":70},[56,2133,2134],{"class":197},"\"later\"",[56,2136,142],{"class":70},[56,2138,2139,2142,2144,2147,2150],{"class":58,"line":345},[56,2140,2141],{"class":66},"assert!",[56,2143,989],{"class":70},[56,2145,2146],{"class":62},">",[56,2148,2149],{"class":138}," 0",[56,2151,142],{"class":70},[56,2153,2154,2157],{"class":58,"line":367},[56,2155,2156],{"class":66},"assert_eq!",[56,2158,2159],{"class":70},"(a, b);\n",[56,2161,2162,2165],{"class":58,"line":387},[56,2163,2164],{"class":66},"assert_ne!",[56,2166,2159],{"class":70},[56,2168,2169,2172,2174,2176,2178,2180],{"class":58,"line":1002},[56,2170,2171],{"class":66},"debug_assert!",[56,2173,989],{"class":70},[56,2175,2146],{"class":62},[56,2177,2149],{"class":138},[56,2179,958],{"class":70},[56,2181,2182],{"class":480},"\u002F\u002F only in debug builds\n",[14,2184,2185,2187,2188,2191],{},[18,2186,2081],{}," is for invariants: \"this state should never happen.\" It unwinds the stack (calling destructors) unless ",[18,2189,2190],{},"panic = \"abort\""," is set in the profile.",[36,2193,2195],{"id":2194},"unwinding-vs-aborting","Unwinding vs Aborting",[2197,2198,2199,2210],"ul",{},[2200,2201,2202,2205,2206,2209],"li",{},[23,2203,2204],{},"Unwind"," (default): cleans up via ",[18,2207,2208],{},"Drop",", then exits the thread\u002Fprocess.",[2200,2211,2212,26,2215,653,2217,2220],{},[23,2213,2214],{},"Abort",[18,2216,2190],{},[18,2218,2219],{},"Cargo.toml","): immediate process exit, smaller binary, faster panic, but no cleanup.",[14,2222,2223,2224,2227],{},"Catch a panic with ",[18,2225,2226],{},"std::panic::catch_unwind"," (rare; mostly for FFI).",[36,2229,2231],{"id":2230},"result-vs-panic-heuristics","Result vs panic — Heuristics",[2197,2233,2234,2243,2252,2258],{},[2200,2235,2236,2238,2239,2242],{},[18,2237,29],{}," for ",[23,2240,2241],{},"expected"," failure (file not found, parse error).",[2200,2244,2245,2238,2248,2251],{},[18,2246,2247],{},"panic",[23,2249,2250],{},"violated invariants"," (index out of bounds, unreachable code, internal corruption).",[2200,2253,2254,2255,2257],{},"Returning ",[18,2256,33],{}," for \"logically absent\" (looking up a key).",[2200,2259,2254,2260,2262],{},[18,2261,29],{}," for \"operation failed\".",[36,2264,2266,2268,2269,2271],{"id":2265},"option-and-result-conversion",[18,2267,33],{}," and ",[18,2270,29],{}," Conversion",[44,2273,2274],{"language":46},[48,2275,2277],{"className":50,"code":2276,"language":46,"meta":52,"style":52},"opt.ok_or(ErrorKind::Missing)?;\nres.ok()?;                    \u002F\u002F discards Err, returns None on Err\nres.err()?;                   \u002F\u002F discards Ok\nres.ok().filter(|x| *x > 0);\nopt.ok_or_else(|| ErrorKind::Missing)?;\n",[18,2278,2279,2305,2325,2344,2379],{"__ignoreMap":52},[56,2280,2281,2284,2286,2289,2291,2294,2296,2299,2301,2303],{"class":58,"line":59},[56,2282,2283],{"class":70},"opt",[56,2285,172],{"class":62},[56,2287,2288],{"class":66},"ok_or",[56,2290,83],{"class":70},[56,2292,2293],{"class":66},"ErrorKind",[56,2295,189],{"class":62},[56,2297,2298],{"class":66},"Missing",[56,2300,751],{"class":70},[56,2302,396],{"class":62},[56,2304,769],{"class":70},[56,2306,2307,2310,2312,2315,2317,2319,2322],{"class":58,"line":145},[56,2308,2309],{"class":70},"res",[56,2311,172],{"class":62},[56,2313,2314],{"class":66},"ok",[56,2316,472],{"class":70},[56,2318,396],{"class":62},[56,2320,2321],{"class":70},";                    ",[56,2323,2324],{"class":480},"\u002F\u002F discards Err, returns None on Err\n",[56,2326,2327,2329,2331,2334,2336,2338,2341],{"class":58,"line":323},[56,2328,2309],{"class":70},[56,2330,172],{"class":62},[56,2332,2333],{"class":66},"err",[56,2335,472],{"class":70},[56,2337,396],{"class":62},[56,2339,2340],{"class":70},";                   ",[56,2342,2343],{"class":480},"\u002F\u002F discards Ok\n",[56,2345,2346,2348,2350,2352,2354,2356,2359,2361,2363,2365,2367,2370,2373,2375,2377],{"class":58,"line":329},[56,2347,2309],{"class":70},[56,2349,172],{"class":62},[56,2351,2314],{"class":66},[56,2353,472],{"class":70},[56,2355,172],{"class":62},[56,2357,2358],{"class":66},"filter",[56,2360,83],{"class":70},[56,2362,941],{"class":62},[56,2364,944],{"class":70},[56,2366,941],{"class":62},[56,2368,2369],{"class":62}," *",[56,2371,2372],{"class":70},"x ",[56,2374,2146],{"class":62},[56,2376,2149],{"class":138},[56,2378,142],{"class":70},[56,2380,2381,2383,2385,2388,2390,2392,2395,2397,2399,2401,2403],{"class":58,"line":345},[56,2382,2283],{"class":70},[56,2384,172],{"class":62},[56,2386,2387],{"class":66},"ok_or_else",[56,2389,83],{"class":70},[56,2391,915],{"class":62},[56,2393,2394],{"class":66}," ErrorKind",[56,2396,189],{"class":62},[56,2398,2298],{"class":66},[56,2400,751],{"class":70},[56,2402,396],{"class":62},[56,2404,769],{"class":70},[36,2406,2408,2410],{"id":2407},"result-combinators",[18,2409,29],{}," Combinators",[44,2412,2413],{"language":46},[48,2414,2416],{"className":50,"code":2415,"language":46,"meta":52,"style":52},"let r: Result\u003Ci32, E> = Ok(5);\nr.map(|x| x + 1);\nr.map_err(|e| OtherError(e));\nr.and_then(|x| Ok(x + 1));\nr.or(Ok(0));\nr.or_else(|_| Ok(0));\nr.unwrap_or(0);\nr.unwrap_or_default();\nr.unwrap_or_else(|_| 0);\nr.is_ok();\nr.is_err();\nr.ok();          \u002F\u002F Option\u003CT>\nr.err();          \u002F\u002F Option\u003CE>\nr.as_ref();\nr.as_mut();\nr.transpose();    \u002F\u002F Option\u003CResult\u003CT, E>> -> Result\u003COption\u003CT>, E>\n",[18,2417,2418,2450,2475,2498,2524,2542,2567,2581,2591,2611,2622,2633,2646,2659,2670,2681],{"__ignoreMap":52},[56,2419,2420,2422,2425,2427,2429,2431,2433,2435,2437,2439,2441,2444,2446,2448],{"class":58,"line":59},[56,2421,112],{"class":62},[56,2423,2424],{"class":70}," r",[56,2426,100],{"class":62},[56,2428,222],{"class":66},[56,2430,71],{"class":70},[56,2432,124],{"class":66},[56,2434,229],{"class":70},[56,2436,232],{"class":66},[56,2438,127],{"class":70},[56,2440,130],{"class":62},[56,2442,2443],{"class":66}," Ok",[56,2445,83],{"class":70},[56,2447,139],{"class":138},[56,2449,142],{"class":70},[56,2451,2452,2455,2457,2459,2461,2463,2465,2467,2469,2471,2473],{"class":58,"line":145},[56,2453,2454],{"class":70},"r",[56,2456,172],{"class":62},[56,2458,936],{"class":66},[56,2460,83],{"class":70},[56,2462,941],{"class":62},[56,2464,944],{"class":70},[56,2466,941],{"class":62},[56,2468,949],{"class":70},[56,2470,952],{"class":62},[56,2472,955],{"class":138},[56,2474,142],{"class":70},[56,2476,2477,2479,2481,2483,2485,2487,2490,2492,2495],{"class":58,"line":323},[56,2478,2454],{"class":70},[56,2480,172],{"class":62},[56,2482,1108],{"class":66},[56,2484,83],{"class":70},[56,2486,941],{"class":62},[56,2488,2489],{"class":70},"e",[56,2491,941],{"class":62},[56,2493,2494],{"class":66}," OtherError",[56,2496,2497],{"class":70},"(e));\n",[56,2499,2500,2502,2504,2506,2508,2510,2512,2514,2516,2518,2520,2522],{"class":58,"line":329},[56,2501,2454],{"class":70},[56,2503,172],{"class":62},[56,2505,976],{"class":66},[56,2507,83],{"class":70},[56,2509,941],{"class":62},[56,2511,944],{"class":70},[56,2513,941],{"class":62},[56,2515,2443],{"class":66},[56,2517,989],{"class":70},[56,2519,952],{"class":62},[56,2521,955],{"class":138},[56,2523,1027],{"class":70},[56,2525,2526,2528,2530,2532,2534,2536,2538,2540],{"class":58,"line":345},[56,2527,2454],{"class":70},[56,2529,172],{"class":62},[56,2531,1015],{"class":66},[56,2533,83],{"class":70},[56,2535,237],{"class":66},[56,2537,83],{"class":70},[56,2539,1024],{"class":138},[56,2541,1027],{"class":70},[56,2543,2544,2546,2548,2550,2552,2554,2557,2559,2561,2563,2565],{"class":58,"line":367},[56,2545,2454],{"class":70},[56,2547,172],{"class":62},[56,2549,1043],{"class":66},[56,2551,83],{"class":70},[56,2553,941],{"class":62},[56,2555,2556],{"class":70},"_",[56,2558,941],{"class":62},[56,2560,2443],{"class":66},[56,2562,83],{"class":70},[56,2564,1024],{"class":138},[56,2566,1027],{"class":70},[56,2568,2569,2571,2573,2575,2577,2579],{"class":58,"line":387},[56,2570,2454],{"class":70},[56,2572,172],{"class":62},[56,2574,874],{"class":66},[56,2576,83],{"class":70},[56,2578,1024],{"class":138},[56,2580,142],{"class":70},[56,2582,2583,2585,2587,2589],{"class":58,"line":1002},[56,2584,2454],{"class":70},[56,2586,172],{"class":62},[56,2588,892],{"class":66},[56,2590,895],{"class":70},[56,2592,2593,2595,2597,2599,2601,2603,2605,2607,2609],{"class":58,"line":1030},[56,2594,2454],{"class":70},[56,2596,172],{"class":62},[56,2598,910],{"class":66},[56,2600,83],{"class":70},[56,2602,941],{"class":62},[56,2604,2556],{"class":70},[56,2606,941],{"class":62},[56,2608,2149],{"class":138},[56,2610,142],{"class":70},[56,2612,2613,2615,2617,2620],{"class":58,"line":1058},[56,2614,2454],{"class":70},[56,2616,172],{"class":62},[56,2618,2619],{"class":66},"is_ok",[56,2621,895],{"class":70},[56,2623,2624,2626,2628,2631],{"class":58,"line":1080},[56,2625,2454],{"class":70},[56,2627,172],{"class":62},[56,2629,2630],{"class":66},"is_err",[56,2632,895],{"class":70},[56,2634,2635,2637,2639,2641,2643],{"class":58,"line":1437},[56,2636,2454],{"class":70},[56,2638,172],{"class":62},[56,2640,2314],{"class":66},[56,2642,830],{"class":70},[56,2644,2645],{"class":480},"\u002F\u002F Option\u003CT>\n",[56,2647,2648,2650,2652,2654,2656],{"class":58,"line":1460},[56,2649,2454],{"class":70},[56,2651,172],{"class":62},[56,2653,2333],{"class":66},[56,2655,830],{"class":70},[56,2657,2658],{"class":480},"\u002F\u002F Option\u003CE>\n",[56,2660,2661,2663,2665,2668],{"class":58,"line":1484},[56,2662,2454],{"class":70},[56,2664,172],{"class":62},[56,2666,2667],{"class":66},"as_ref",[56,2669,895],{"class":70},[56,2671,2672,2674,2676,2679],{"class":58,"line":1490},[56,2673,2454],{"class":70},[56,2675,172],{"class":62},[56,2677,2678],{"class":66},"as_mut",[56,2680,895],{"class":70},[56,2682,2683,2685,2687,2690,2693],{"class":58,"line":1496},[56,2684,2454],{"class":70},[56,2686,172],{"class":62},[56,2688,2689],{"class":66},"transpose",[56,2691,2692],{"class":70},"();    ",[56,2694,2695],{"class":480},"\u002F\u002F Option\u003CResult\u003CT, E>> -> Result\u003COption\u003CT>, E>\n",[36,2697,2699],{"id":2698},"multiple-errors","Multiple Errors",[44,2701,2702],{"language":46},[48,2703,2705],{"className":50,"code":2704,"language":46,"meta":52,"style":52},"fn parse_two(s1: &str, s2: &str) -> Result\u003C(i32, i32), ParseIntError> {\n    let a: i32 = s1.parse()?;\n    let b: i32 = s2.parse()?;\n    Ok((a, b))\n}\n",[18,2706,2707,2753,2779,2805,2812],{"__ignoreMap":52},[56,2708,2709,2711,2714,2717,2719,2721,2723,2726,2728,2730,2732,2734,2736,2738,2741,2743,2745,2747,2749,2751],{"class":58,"line":59},[56,2710,265],{"class":62},[56,2712,2713],{"class":66}," parse_two",[56,2715,2716],{"class":70},"(s1",[56,2718,100],{"class":62},[56,2720,276],{"class":62},[56,2722,279],{"class":66},[56,2724,2725],{"class":70},", s2",[56,2727,100],{"class":62},[56,2729,276],{"class":62},[56,2731,279],{"class":66},[56,2733,282],{"class":70},[56,2735,285],{"class":62},[56,2737,222],{"class":66},[56,2739,2740],{"class":70},"\u003C(",[56,2742,124],{"class":66},[56,2744,229],{"class":70},[56,2746,124],{"class":66},[56,2748,88],{"class":70},[56,2750,304],{"class":66},[56,2752,307],{"class":70},[56,2754,2755,2757,2760,2762,2764,2766,2769,2771,2773,2775,2777],{"class":58,"line":145},[56,2756,451],{"class":62},[56,2758,2759],{"class":70}," a",[56,2761,100],{"class":62},[56,2763,459],{"class":66},[56,2765,462],{"class":62},[56,2767,2768],{"class":70}," s1",[56,2770,172],{"class":62},[56,2772,317],{"class":66},[56,2774,472],{"class":70},[56,2776,396],{"class":62},[56,2778,769],{"class":70},[56,2780,2781,2783,2786,2788,2790,2792,2795,2797,2799,2801,2803],{"class":58,"line":323},[56,2782,451],{"class":62},[56,2784,2785],{"class":70}," b",[56,2787,100],{"class":62},[56,2789,459],{"class":66},[56,2791,462],{"class":62},[56,2793,2794],{"class":70}," s2",[56,2796,172],{"class":62},[56,2798,317],{"class":66},[56,2800,472],{"class":70},[56,2802,396],{"class":62},[56,2804,769],{"class":70},[56,2806,2807,2809],{"class":58,"line":329},[56,2808,348],{"class":66},[56,2810,2811],{"class":70},"((a, b))\n",[56,2813,2814],{"class":58,"line":345},[56,2815,326],{"class":70},[14,2817,2818,2819,2822],{},"For independent errors you want to accumulate (not short-circuit), use ",[18,2820,2821],{},"itertools::process_results"," or roll your own.",[36,2824,2826,2828],{"id":2825},"result-with-multiple-variants",[18,2827,29],{}," with Multiple Variants",[14,2830,2831,2832,2835,2836,2838],{},"Use ",[18,2833,2834],{},"Result\u003CT, MyErrorEnum>"," and a custom error enum (see ",[18,2837,1786],{}," above).",[36,2840,2842,2845],{"id":2841},"boxdyn-error-as-catchall",[18,2843,2844],{},"Box\u003Cdyn Error>"," as Catchall",[44,2847,2848],{"language":46},[48,2849,2851],{"className":50,"code":2850,"language":46,"meta":52,"style":52},"fn foo() -> Result\u003Ci32, Box\u003Cdyn std::error::Error>> {\n    let n: i32 = \"x\".parse()?;     \u002F\u002F works for any Error type\n    let f = std::fs::File::open(\"x\")?;\n    Ok(n)\n}\n",[18,2852,2853,2890,2918,2954,2961],{"__ignoreMap":52},[56,2854,2855,2857,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884,2886,2888],{"class":58,"line":59},[56,2856,265],{"class":62},[56,2858,2859],{"class":66}," foo",[56,2861,681],{"class":70},[56,2863,285],{"class":62},[56,2865,222],{"class":66},[56,2867,71],{"class":70},[56,2869,124],{"class":66},[56,2871,229],{"class":70},[56,2873,691],{"class":66},[56,2875,71],{"class":70},[56,2877,696],{"class":62},[56,2879,699],{"class":70},[56,2881,189],{"class":62},[56,2883,704],{"class":70},[56,2885,189],{"class":62},[56,2887,709],{"class":66},[56,2889,712],{"class":70},[56,2891,2892,2894,2896,2898,2900,2902,2905,2907,2909,2911,2913,2915],{"class":58,"line":145},[56,2893,451],{"class":62},[56,2895,454],{"class":70},[56,2897,100],{"class":62},[56,2899,459],{"class":66},[56,2901,462],{"class":62},[56,2903,2904],{"class":197}," \"x\"",[56,2906,172],{"class":62},[56,2908,317],{"class":66},[56,2910,472],{"class":70},[56,2912,396],{"class":62},[56,2914,477],{"class":70},[56,2916,2917],{"class":480},"\u002F\u002F works for any Error type\n",[56,2919,2920,2922,2925,2927,2929,2931,2933,2935,2938,2940,2943,2945,2948,2950,2952],{"class":58,"line":323},[56,2921,451],{"class":62},[56,2923,2924],{"class":70}," f ",[56,2926,130],{"class":62},[56,2928,699],{"class":66},[56,2930,189],{"class":62},[56,2932,2014],{"class":66},[56,2934,189],{"class":62},[56,2936,2937],{"class":66},"File",[56,2939,189],{"class":62},[56,2941,2942],{"class":66},"open",[56,2944,83],{"class":70},[56,2946,2947],{"class":197},"\"x\"",[56,2949,751],{"class":70},[56,2951,396],{"class":62},[56,2953,769],{"class":70},[56,2955,2956,2958],{"class":58,"line":329},[56,2957,348],{"class":66},[56,2959,2960],{"class":70},"(n)\n",[56,2962,2963],{"class":58,"line":345},[56,2964,326],{"class":70},[14,2966,2967,2969,2970,2972],{},[18,2968,2844],{}," accepts any error via ",[18,2971,396],{},". Loses static type info; ok for prototypes.",[36,2974,2976],{"id":2975},"error-chaining","Error Chaining",[44,2978,2979],{"language":46},[48,2980,2982],{"className":50,"code":2981,"language":46,"meta":52,"style":52},"return Err(MyError::New).context(\"while processing X\"));\n",[18,2983,2984],{"__ignoreMap":52},[56,2985,2986,2989,2991,2993,2996,2998,3001,3003,3005,3008,3010,3013],{"class":58,"line":59},[56,2987,2988],{"class":62},"return",[56,2990,546],{"class":66},[56,2992,83],{"class":70},[56,2994,2995],{"class":66},"MyError",[56,2997,189],{"class":62},[56,2999,3000],{"class":66},"New",[56,3002,751],{"class":70},[56,3004,172],{"class":62},[56,3006,3007],{"class":66},"context",[56,3009,83],{"class":70},[56,3011,3012],{"class":197},"\"while processing X\"",[56,3014,1027],{"class":70},[14,3016,3017,3019,3020,3022],{},[18,3018,1936],{},"'s ",[18,3021,1959],{}," trait adds messages:",[44,3024,3025],{"language":46},[48,3026,3028],{"className":50,"code":3027,"language":46,"meta":52,"style":52},"std::fs::read_to_string(path).context(\"read config\")?;\n",[18,3029,3030],{"__ignoreMap":52},[56,3031,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3053,3055,3057],{"class":58,"line":59},[56,3033,1275],{"class":66},[56,3035,189],{"class":62},[56,3037,2014],{"class":66},[56,3039,189],{"class":62},[56,3041,2019],{"class":66},[56,3043,2022],{"class":70},[56,3045,172],{"class":62},[56,3047,3007],{"class":66},[56,3049,83],{"class":70},[56,3051,3052],{"class":197},"\"read config\"",[56,3054,751],{"class":70},[56,3056,396],{"class":62},[56,3058,769],{"class":70},[14,3060,3061,3062,172],{},"The error chain shows: \"read config\" → original ",[18,3063,3064],{},"io::Error",[36,3066,3068],{"id":3067},"edge-cases-pitfalls","Edge Cases & Pitfalls",[2197,3070,3071,3086,3097,3107,3124,3132,3152,3166,3178,3189,3211,3228,3242],{},[2200,3072,3073,3079,3080,3082,3083,3085],{},[23,3074,3075,3078],{},[18,3076,3077],{},"unwrap()"," in production",": panic on bad input. Use ",[18,3081,396],{}," or ",[18,3084,332],{}," instead.",[2200,3087,3088,3096],{},[23,3089,3090,3093,3094],{},[18,3091,3092],{},"expect()"," is better than ",[18,3095,756],{},": a custom message helps debugging.",[2200,3098,3099,3102,3103,3106],{},[23,3100,3101],{},"Panic across FFI",": undefined behavior — use ",[18,3104,3105],{},"catch_unwind"," at the FFI boundary.",[2200,3108,3109,3115,3116,3118,3119,3019,3121,3123],{},[23,3110,3111,2268,3113],{},[18,3112,396],{},[18,3114,567],{},": when mixing error types, ensure ",[18,3117,567],{}," impls exist; ",[18,3120,1786],{},[18,3122,1916],{}," is the easy way.",[2200,3125,3126,3129,3130,172],{},[23,3127,3128],{},"Panic in destructors",": aborts; avoid panicking in ",[18,3131,2208],{},[2200,3133,3134,3144,3145,3147,3148,3151],{},[23,3135,3136,577,3138,3140,3141,3143],{},[18,3137,396],{},[18,3139,33],{}," returns from ",[18,3142,33],{},"-returning functions only",": ",[18,3146,396],{}," requires ",[18,3149,3150],{},"Try",", and the return type must match.",[2200,3153,3154,3165],{},[23,3155,3156,3147,3158,3161,3162],{},[18,3157,1119],{},[18,3159,3160],{},"Send + Sync"," to box as ",[18,3163,3164],{},"Box\u003Cdyn Error + Send + Sync>"," — useful for thread-safe error storage.",[2200,3167,3168,3144,3171,3174,3175,3177],{},[23,3169,3170],{},"Backtraces",[18,3172,3173],{},"std::backtrace::Backtrace"," (1.65+) gives you a backtrace at error construction; ",[18,3176,1936],{}," integrates with it.",[2200,3179,3180,3188],{},[23,3181,3182,30,3185],{},[18,3183,3184],{},"Result::into_ok",[18,3186,3187],{},"into_err"," consume without checking — useful only when you're sure.",[2200,3190,3191,3144,3199,229,3202,229,3205,229,3208,172],{},[23,3192,3193,3195,3196,3198],{},[18,3194,29],{}," vs ",[18,3197,33],{}," interop",[18,3200,3201],{},"Option::ok_or",[18,3203,3204],{},"Option::ok_or_else",[18,3206,3207],{},"Result::ok",[18,3209,3210],{},"Result::err",[2200,3212,3213,3216,3217,3220,3221,3224,3225,172],{},[23,3214,3215],{},"Panicking in a thread",": kills the thread but not the process. Use ",[18,3218,3219],{},"JoinHandle"," to detect; the panic becomes ",[18,3222,3223],{},"Box\u003Cdyn Any + Send>"," from ",[18,3226,3227],{},"join",[2200,3229,3230,3238,3239,172],{},[23,3231,3232,3234,3235],{},[18,3233,207],{}," where ",[18,3236,3237],{},"T == E",": the compiler can't infer which arm you mean — annotate or use ",[18,3240,3241],{},".map_err",[2200,3243,3244,3249,3250,3252],{},[23,3245,3246,3247],{},"Custom error type without ",[18,3248,1253],{},": required by ",[18,3251,709],{}," trait; derive it.",[36,3254,3256],{"id":3255},"idioms-cheat-sheet","Idioms Cheat Sheet",[2197,3258,3259,3264,3269,3275,3280,3285,3290],{},[2200,3260,2831,3261,3263],{},[18,3262,396],{}," to propagate.",[2200,3265,3266,3267,172],{},"Define one error enum per crate with ",[18,3268,1786],{},[2200,3270,2831,3271,3274],{},[18,3272,3273],{},"anyhow::Result"," in application code (binary crates).",[2200,3276,2831,3277,3279],{},[18,3278,29],{}," in library APIs.",[2200,3281,2831,3282,3284],{},[18,3283,33],{}," only when absence is normal, not \"operation failed\".",[2200,3286,3287,3289],{},[18,3288,2081],{}," for invariants, never for input validation in public APIs.",[2200,3291,3292,3294,3295,3297],{},[18,3293,2141],{}," for tests; ",[18,3296,2171],{}," for invariants you don't want in release.",[36,3299,3301],{"id":3300},"summary","Summary",[14,3303,3304,3305,229,3307,3309,3310,3312,3313,3315,3316,3318,3319,3321,3322,3324,3325,662,3327,172],{},"Errors are values, handled via ",[18,3306,396],{},[18,3308,332],{},", and combinators. ",[18,3311,33],{}," = absence, ",[18,3314,29],{}," = failure. ",[18,3317,1786],{}," for libraries, ",[18,3320,1936],{}," for apps. ",[18,3323,2081],{}," for invariants only. ",[18,3326,656],{},[18,3328,29],{},[14,3330,3331],{},"Next: Memory management — smart pointers and interior mutability.",[3333,3334,3335],"style",{},"html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}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 .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}",{"title":52,"searchDepth":145,"depth":145,"links":3337},[3338,3340,3342,3349,3350,3352,3359,3361,3362,3363,3365,3367,3368,3370,3372,3373,3374,3375],{"id":38,"depth":145,"text":3339},"Option\u003CT> — Absence",{"id":204,"depth":145,"text":3341},"Result\u003CT, E> — Recoverable Errors",{"id":392,"depth":145,"text":3343,"children":3344},"The ? Operator",[3345,3347],{"id":574,"depth":323,"text":3346},"? on Option",{"id":650,"depth":323,"text":3348},"? in main",{"id":803,"depth":145,"text":804},{"id":1116,"depth":145,"text":3351},"The std::error::Error Trait",{"id":1233,"depth":145,"text":1234,"children":3353},[3354,3355,3357],{"id":1237,"depth":323,"text":1238},{"id":1783,"depth":323,"text":3356},"The thiserror Crate (idiomatic)",{"id":1933,"depth":323,"text":3358},"The anyhow Crate (applications)",{"id":2078,"depth":145,"text":3360},"panic! — Unrecoverable",{"id":2194,"depth":145,"text":2195},{"id":2230,"depth":145,"text":2231},{"id":2265,"depth":145,"text":3364},"Option and Result Conversion",{"id":2407,"depth":145,"text":3366},"Result Combinators",{"id":2698,"depth":145,"text":2699},{"id":2825,"depth":145,"text":3369},"Result with Multiple Variants",{"id":2841,"depth":145,"text":3371},"Box\u003Cdyn Error> as Catchall",{"id":2975,"depth":145,"text":2976},{"id":3067,"depth":145,"text":3068},{"id":3255,"depth":145,"text":3256},{"id":3300,"depth":145,"text":3301},"Rust's error handling is a defining strength. There's no exceptions, no null. Errors are values (Result\u002FOption) and the type system forces you to handle them.","md",{},"\u002Frust\u002F18-error-handling",{"title":5,"description":3376},"rust\u002F18-error-handling","a_bpq0bJV2oU2TWnnQUgdtcl-BduOz5GYWaLdRZQVnU",1785944093242]