[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-js2go-ep28-error-stacktrace-logging-all--*":3,"academy-blog-translations-04bk65q6nmfw3v9":81},{"data":4,"page":80,"perPage":80,"totalItems":80,"totalPages":80},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":75,"keywords":76,"locale":49,"published_at":77,"scheduled_at":13,"school_blog":71,"short_description":78,"status":69,"title":6,"updated":79,"updated_by":13,"slug":72,"views":74},"JS2GO EP.28 การจัดการ Errors เชิงลึก: Stack Trace และ Logging","sclblg987654321","school_blog_translations","\u003Cp>การจัดการ \u003Cstrong>Errors\u003C\u002Fstrong> เป็นสิ่งสำคัญสำหรับการพัฒนาโปรแกรมอย่างมืออาชีพ โดยเฉพาะเมื่อระบบมีขนาดใหญ่หรือทำงานใน \u003Cstrong>production environment\u003C\u002Fstrong> ต้องสามารถ debug และวิเคราะห์ปัญหาได้อย่างรวดเร็ว ในบทความนี้เราจะสอนการจัดการ Errors เชิงลึกใน \u003Cstrong>JavaScript\u003C\u002Fstrong> และ \u003Cstrong>Go\u003C\u002Fstrong> รวมถึงการใช้ \u003Cstrong>Stack Trace\u003C\u002Fstrong> และ \u003Cstrong>Logging\u003C\u002Fstrong> เพื่อวิเคราะห์ปัญหาอย่างมีประสิทธิภาพ\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>1. Errors และ Stack Trace ใน JavaScript\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>การสร้างและจัดการ Error\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-javascript\">function divide(a, b) {\n  if (b === 0) {\n    throw new Error(\"Cannot divide by zero\");\n  }\n  return a \u002F b;\n}\n\ntry {\n  const result = divide(10, 0);\n} catch (err) {\n  console.error(\"Error:\", err.message);\n  console.error(err.stack); \u002F\u002F แสดง stack trace\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>ข้อดี JavaScript:\u003C\u002Fstrong>\u003Cbr>✔️ Stack trace แสดงตำแหน่งที่เกิด error\u003Cbr>✔️ Error object สามารถเพิ่ม properties เพิ่มเติมได้\u003Cbr>✔️ ใช้งานง่ายสำหรับ debugging\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>ข้อจำกัด:\u003C\u002Fstrong>\u003Cbr>⚠️ Runtime error ต้องจัดการด้วย try\u002Fcatch\u003Cbr>⚠️ Async code ต้องใช้ try\u002Fcatch + async\u002Fawait หรือ .catch()\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>การจับ Error แบบ Asynchronous\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-javascript\">async function fetchData() {\n  throw new Error(\"Network error\");\n}\n\nfetchData()\n  .then(data =&gt; console.log(data))\n  .catch(err =&gt; console.error(err.stack));\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>2. Errors และ Stack Trace ใน Go\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>การใช้ error type\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"errors\"\n    \"fmt\"\n)\n\nfunc divide(a, b int) (int, error) {\n    if b == 0 {\n        return 0, errors.New(\"cannot divide by zero\")\n    }\n    return a \u002F b, nil\n}\n\nfunc main() {\n    result, err := divide(10, 0)\n    if err != nil {\n        fmt.Println(\"Error:\", err)\n    } else {\n        fmt.Println(\"Result:\", result)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>การสร้าง Stack Trace\u003C\u002Fh3>\u003Cp>Go ไม่มี stack trace อัตโนมัติเหมือน JavaScript แต่สามารถใช้ \u003Ccode inline=\"\">runtime\u002Fdebug\u003C\u002Fcode> package:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">import (\n    \"errors\"\n    \"fmt\"\n    \"runtime\u002Fdebug\"\n)\n\nfunc main() {\n    err := errors.New(\"something went wrong\")\n    if err != nil {\n        fmt.Println(\"Error:\", err)\n        fmt.Println(string(debug.Stack()))\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>ข้อดี Go:\u003C\u002Fstrong>\u003Cbr>✔️ Type-safe ตรวจสอบ error ทุก function call\u003Cbr>✔️ สามารถเพิ่ม context ด้วย \u003Ccode inline=\"\">fmt.Errorf(\"context: %w\", err)\u003C\u002Fcode>\u003Cbr>✔️ ใช้ร่วมกับ Logging libraries เช่น logrus, zap\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>ข้อจำกัด:\u003C\u002Fstrong>\u003Cbr>⚠️ ต้อง explicit เพิ่ม stack trace\u003Cbr>⚠️ Error handling ต้อง return error และ check ทุกครั้ง\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>3. การรวม Logging กับ Error\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>JavaScript + Logging (Winston)\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-javascript\">const winston = require('winston');\n\nconst logger = winston.createLogger({\n  transports: [new winston.transports.Console()]\n});\n\ntry {\n  throw new Error(\"Something went wrong\");\n} catch (err) {\n  logger.error(err.message, { stack: err.stack });\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>Go + Logging (Logrus)\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">import log \"github.com\u002Fsirupsen\u002Flogrus\"\n\nfunc main() {\n    err := errors.New(\"Something went wrong\")\n    if err != nil {\n        log.WithFields(log.Fields{\n            \"stack\": string(debug.Stack()),\n        }).Error(err)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>4. แนวทางปฏิบัติที่เหมาะสม\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>✔️ ใช้ Error object \u002F error type อย่างเต็มที่\u003Cbr>✔️ เพิ่ม \u003Cstrong>context\u003C\u002Fstrong> ให้กับ error เพื่อให้ง่ายต่อการ debug\u003Cbr>✔️ ใช้ \u003Cstrong>Stack Trace\u003C\u002Fstrong> เมื่อเกิด error\u003Cbr>✔️ รวมกับ \u003Cstrong>Logging\u003C\u002Fstrong> เพื่อบันทึกเหตุการณ์และตำแหน่ง error\u003Cbr>✔️ แยก \u003Cstrong>error handling ตาม environment\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>Development: log + stack trace\u003C\u002Fli>\u003Cli>Production: log summary + alert\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>5. สรุปเปรียบเทียบ JavaScript vs Go\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Feature\u003C\u002Fth>\u003Cth>JavaScript\u003C\u002Fth>\u003Cth>Go\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Error Type\u003C\u002Ftd>\u003Ctd>Error object\u003C\u002Ftd>\u003Ctd>error interface\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Stack Trace\u003C\u002Ftd>\u003Ctd>Automatic (err.stack)\u003C\u002Ftd>\u003Ctd>runtime\u002Fdebug.Stack()\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Logging Integration\u003C\u002Ftd>\u003Ctd>Winston, Pino\u003C\u002Ftd>\u003Ctd>logrus, zap\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Error Context\u003C\u002Ftd>\u003Ctd>Can add properties dynamically\u003C\u002Ftd>\u003Ctd>Use fmt.Errorf or wrap errors\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Async Handling\u003C\u002Ftd>\u003Ctd>try\u002Fcatch + async\u002Fawait\u003C\u002Ftd>\u003Ctd>Return error from function\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>คำแนะนำ:\u003C\u002Fstrong>\u003Cbr>✔️ Web apps \u002F frontend-heavy → JavaScript stack trace + logging\u003Cbr>✔️ Backend \u002F server → Go error + logging + stack trace\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>การรวม stack trace กับ structured logging\u003C\u002Fstrong> ช่วยให้สามารถ debug และ monitor production ได้อย่างมืออาชีพ\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ตอนต่อไป\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ใน EP.29 ของซีรีส์ JS2GO เราจะพาคุณไปเรียนรู้ \u003Cstrong>การจัดการ Signal และ Process ใน Go กับ JavaScript\u003C\u002Fstrong> เพื่อควบคุม process, signal และ lifecycle ของแอปพลิเคชันอย่างถูกต้องและปลอดภัย\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>อ่านบทความ Series อื่นๆ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FGolang\">\u003Cstrong>Golang The Series\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FJS2GO\">\u003Cstrong>JS2GO\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FTailwind%20CSS\">\u003Cstrong>10 Ep ที่จะให้คุณเป็นมือโปร Tailwind CSS ในชั่วข้ามคืน\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🔴 YouTube : \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUC2eI2RxcA2zbTqZyHyWIfRg\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevschool\u002F\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002F\">\u003Cstrong>https:\u002F\u002Fwww.superdevacademy.com\u002F\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>&nbsp;\u003C\u002Fstrong>\u003C\u002Fp>","55_11zon_gz9tjo9a1p.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fhq5noyn7lhwwv84\u002F55_11zon_gz9tjo9a1p.webp","2026-03-04 08:45:59.460Z","",{"keywords":15,"locale":43,"school_blog":53},[16,23,28,33,38],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:45:58.744Z","n49ukf60srps08s","Errors","2026-04-10 16:13:06.957Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:45:58.499Z","8fjp9z3zgivqiqf","Stack Trace","2026-04-10 16:13:06.870Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:33:55.302Z","0mue4zt83jcdtq9","Logging","2026-04-10 16:08:03.396Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:20:42.484Z","vslzz9nvv6n77cx","JavaScript","2026-04-10 16:07:28.339Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"code":44,"collectionId":45,"collectionName":46,"created":47,"flag":48,"id":49,"is_default":50,"label":51,"updated":52},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":54,"collectionId":55,"collectionName":56,"created":13,"expand":57,"id":71,"slug":72,"updated":73,"views":74},"hsa1afr8fcnd6qb","pbc_2105096300","school_blogs",{"category":58},{"blogIds":59,"collectionId":60,"collectionName":61,"created":62,"created_by":13,"id":54,"image":63,"image_alt":13,"image_path":64,"label":65,"name":66,"priority":67,"publish_at":68,"scheduled_at":13,"status":69,"updated":70,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:24:37.986Z","js2_go_2_11zon_y6paxmuz32.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fhsa1afr8fcnd6qb\u002Fjs2_go_2_11zon_y6paxmuz32.webp",{"en":66,"th":66},"JS2GO",10,"2025-08-11 03:41:08.820Z","published","2026-04-25 02:32:14.339Z","04bk65q6nmfw3v9","js2go-ep28-error-stacktrace-logging","2026-05-08 22:51:20.947Z",218,"hq5noyn7lhwwv84",[20,25,30,35,40],"2025-10-14 10:07:35.545Z","เรียนรู้การจัดการ Errors ใน JavaScript และ Go พร้อม Stack Trace และ Logging เพื่อช่วย debug และ monitor ระบบอย่างมืออาชีพ พร้อมตัวอย่างโค้ดและแนวทางปฏิบัติที่ดีที่สุด","2026-04-25 02:47:59.065Z",1,{"th":72,"en":72}]