นักพัฒนา Rust กำลังถกเถียงเกี่ยวกับไลบรารีจัดการข้อผิดพลาดใหม่ที่เรียกว่า Stack Error ซึ่งมีเป้าหมายในการเชื่อมช่องว่างระหว่างไลบรารียอดนิยมอย่าง Anyhow และ Thiserror การสนทนาในชุมชนได้เผยให้เห็นข้อมูลเชิงลึกที่น่าสนใจเกี่ยวกับวิธีการของ Stack Error ในการดีบั๊กและติดตามข้อผิดพลาด โดยเฉพาะอย่างยิ่งการใช้ข้อมูลตำแหน่งไฟล์และหมายเลขบรรทัด
track_caller สามารถแทนที่มาโครสำหรับข้อมูลตำแหน่งได้
หนึ่งในการสนทนาที่มีข้อมูลเชิงลึกมากที่สุดเกี่ยวกับ Stack Error คือการใช้งานการติดตามตำแหน่งไฟล์และหมายเลขบรรทัด ปัจจุบัน Stack Error ใช้มาโครเช่น stack_msg!
และ stack_err!
เพื่อบันทึกข้อมูลตำแหน่งสำหรับข้อความแสดงข้อผิดพลาด อย่างไรก็ตาม สมาชิกในชุมชนได้ชี้ให้เห็นวิธีแก้ปัญหาที่อาจจะสง่างามกว่า:
หากมาโครมีไว้เพียงเพื่อรับข้อมูลไฟล์และหมายเลขบรรทัด คุณสามารถทำสิ่งเดียวกันได้โดยใช้ฟังก์ชัน
#[track_caller]
ร่วมกับstd::panic::Location
เพื่อรับข้อมูลเดียวกัน
ข้อเสนอนี้ชี้ให้เห็นว่า Stack Error อาจจะสามารถทำให้การใช้งานง่ายขึ้นได้โดยใช้ความสามารถในการติดตามตำแหน่งที่มีอยู่แล้วใน Rust แทนที่จะพึ่งพามาโคร ผู้สร้างไลบรารีตอบสนองในเชิงบวกต่อข้อมูลเชิงลึกนี้ โดยระบุว่าพวกเขาไม่เคยทราบเกี่ยวกับ track_caller
มาก่อนและจะพิจารณาการใช้วิธีนี้ ซึ่งอาจจะกำจัดความจำเป็นในการใช้มาโครได้ทั้งหมด
ข้อกังวลเกี่ยวกับการใช้งาน Error Display
อีกประเด็นทางเทคนิคที่ถูกยกขึ้นมาในการสนทนาเกี่ยวข้องกับวิธีการแสดงข้อผิดพลาด สมาชิกในชุมชนได้ชี้ให้เห็นว่าวิธีการปัจจุบันของ Stack Error ในการแสดงข้อผิดพลาดอาจก่อให้เกิดปัญหา:
การใช้งาน Display ไม่ควรรวมแหล่งที่มาของมัน การจัดการข้อผิดพลาดมาตรฐานคาดหวังว่าข้อผิดพลาดจะแสดงเฉพาะตัวมันเองด้วย Display เพราะเป็นเรื่องปกติมากที่จะวนซ้ำผ่านแหล่งที่มาและพิมพ์สิ่งเหล่านั้น ดังนั้นถ้า Display พิมพ์แหล่งที่มาด้วย คุณก็จะซ้ำซ้อนเอาต์พุต
ข้อเสนอแนะนี้กล่าวถึงแง่มุมที่ละเอียดอ่อนแต่สำคัญของการจัดการข้อผิดพลาดใน Rust - การแยกระหว่างข้อความข้อผิดพลาดของตัวมันเองและห่วงโซ่แหล่งที่มาของมัน ข้อเสนอคือให้เก็บข้อมูลแหล่งที่มาไว้ในการใช้งาน Debug แต่ไม่ใช่ใน Display ซึ่งสอดคล้องกับแนวปฏิบัติมาตรฐานในระบบนิเวศ Rust
การเปรียบเทียบกับไลบรารีจัดการข้อผิดพลาดที่มีอยู่
การสนทนาในชุมชนยังรวมถึงการเปรียบเทียบกับไลบรารีจัดการข้อผิดพลาดอื่น ๆ เช่น SNAFU และ Error Stack ผู้สร้าง Stack Error อธิบายว่าในขณะที่ SNAFU รวมคุณสมบัติของทั้ง Anyhow และ Thiserror แต่ Stack Error แตกต่างจากไลบรารีอื่นโดยการให้:
- รหัสข้อผิดพลาดและ URI สำหรับการจัดการข้อผิดพลาดในระหว่างการทำงานโดยไม่ต้องเปรียบเทียบสตริง
- สแต็กเสมือนที่สร้างขึ้นโดยการซ้อนข้อความแสดงข้อผิดพลาด
- ปรัชญาที่ว่าข้อความแสดงข้อผิดพลาดมีไว้สำหรับการดีบั๊ก ไม่ใช่สำหรับการจัดการข้อผิดพลาดในระหว่างการทำงาน
การเปรียบเทียบเหล่านี้แสดงให้เห็นถึงวิวัฒนาการที่กำลังดำเนินอยู่ในระบบนิเวศการจัดการข้อผิดพลาดของ Rust โดยไลบรารีต่าง ๆ มีวิธีการที่หลากหลายในการแก้ปัญหาที่คล้ายคลึงกัน
เป้าหมายของ Stack Error
- มอบการยศาสตร์ที่คล้ายคลึงกับ Anyhow
- สร้างข้อความแสดงข้อผิดพลาดที่มีข้อมูลครบถ้วนซึ่งช่วยในการแก้ไขข้อบกพร่อง
- ให้ข้อมูลที่มีประเภทกำหนดซึ่งช่วยในการจัดการข้อผิดพลาดในขณะทำงาน
คุณสมบัติหลักของ Stack Error
- การติดตามไฟล์และหมายเลขบรรทัดในข้อความแสดงข้อผิดพลาด
- รองรับรหัสข้อผิดพลาดสำหรับการจัดการข้อผิดพลาดในขณะทำงาน
- การซ้อนข้อความเพื่อให้ข้อมูลบริบทที่สมบูรณ์
- เข้ากันได้กับ trait
std::error::Error
สำหรับการพัฒนาไลบรารี - มาโครสำหรับการสร้างและจัดการข้อผิดพลาดอย่างง่าย
ข้อได้เปรียบเหนือ Anyhow สำหรับการพัฒนาไลบรารี
มีหลายความคิดเห็นที่พูดถึง Stack Error เมื่อเทียบกับไลบรารียอดนิยมอย่าง Anyhow ในขณะที่ผู้ใช้บางคนแสดงความชื่นชอบในความเรียบง่ายของ Anyhow คนอื่น ๆ ก็ชี้ให้เห็นข้อได้เปรียบของ Stack Error สำหรับการพัฒนาไลบรารี ความแตกต่างสำคัญที่ถูกเน้นย้ำคือ ไม่เหมือนกับประเภทข้อผิดพลาดของ Anyhow Stack Error ใช้งาน trait std::error::Error
ทำให้เหมาะสำหรับการพัฒนาไลบรารีมากกว่าแค่โค้ดแอปพลิเคชัน
สิ่งนี้ทำให้ Stack Error อยู่ในตำแหน่งที่อาจเติมเต็มช่องว่างสำคัญในระบบนิเวศ Rust - การให้ความสะดวกในการใช้งานของ Anyhow พร้อมกับความเข้ากันได้กับไลบรารีของ Thiserror
สรุปได้ว่า Stack Error เป็นการพัฒนาที่น่าสนใจในภูมิทัศน์การจัดการข้อผิดพลาดของ Rust ข้อเสนอแนะจากชุมชนชี้ให้เห็นถึงหลายวิธีที่ไลบรารีนี้อาจจะพัฒนาต่อไป โดยเฉพาะอย่างยิ่งเกี่ยวกับรายละเอียดการใช้งานเช่นการติดตามตำแหน่งและการแสดงข้อผิดพลาด เมื่อผู้สร้างนำข้อเสนอแนะเหล่านี้มาปรับใช้ Stack Error อาจกลายเป็นส่วนเสริมที่มีคุณค่าสำหรับเครื่องมือของนักพัฒนา Rust โดยเฉพาะอย่างยิ่งสำหรับผู้ที่กำลังสร้างไลบรารีที่ต้องการทั้งข้อมูลการดีบั๊กที่ดีและความสามารถในการจัดการข้อผิดพลาดในระหว่างการทำงาน
อ้างอิง: Stack Error