การเขียนไปยังข้อผิดพลาดมาตรฐาน

C:
การเขียนไปยังข้อผิดพลาดมาตรฐาน

วิธีการ:

ในภาษา C สามารถใช้กระแส stderr เพื่อเขียนข้อความแสดงข้อผิดพลาด ไม่เหมือนกับการเขียนไปยังผลลัพธ์มาตรฐานด้วย printf, การเขียนไปยัง stderr สามารถทำได้โดยใช้ fprintf หรือ fputs นี่คือวิธีที่คุณทำได้:

#include <stdio.h>

int main() {
    fprintf(stderr, "This is an error message.\n");

    fputs("This is another error message.\n", stderr);
    
    return 0;
}

ผลลัพธ์ตัวอย่าง (ไปยัง stderr):

This is an error message.
This is another error message.

สำคัญที่จะต้องทราบว่าในขณะที่ผลลัพธ์อาจดูคล้ายกับ stdout ในคอนโซล เมื่อใช้การเปลี่ยนทิศทางในเทอร์มินัล ความแตกต่างจะชัดเจนขึ้น:

$ ./your_program > output.txt

คำสั่งนี้เปลี่ยนทิศทางเฉพาะผลลัพธ์มาตรฐานไปยัง output.txt, ในขณะที่ข้อความแสดงข้อผิดพลาดยังปรากฏบนหน้าจอ

การศึกษาเจาะลึก

ความแตกต่างระหว่าง stdout และ stderr ในระบบที่ใช้ Unix มีมาตั้งแต่วันแรกของภาษา C และ Unix การแยกนี้ช่วยให้มีการจัดการข้อผิดพลาดและการบันทึกได้อย่างมีประสิทธิภาพมากขึ้น เนื่องจากช่วยให้โปรแกรมเมอร์สามารถเปลี่ยนทิศทางข้อความแสดงข้อผิดพลาดได้โดยไม่ขึ้นกับผลลัพธ์มาตรฐานของโปรแกรม ขณะที่ stderr เป็น unbuffered โดยค่าเริ่มต้นเพื่อให้มั่นใจว่าข้อความแสดงข้อผิดพลาดสามารถแสดงผลได้ทันที ซึ่งช่วยในการดีบั๊กการล่มสลายและปัญหาสำคัญอื่น ๆ ในขณะที่ stdout โดยปกติจะมีการบัฟเฟอร์ หมายความว่าผลลัพธ์อาจล่าช้าจนกว่าบัฟเฟอร์จะถูกล้าง (เช่น การเสร็จสิ้นโปรแกรมหรือการล้างด้วยตนเอง)

ในแอพพลิเคชันสมัยใหม่ การเขียนไปยัง stderr ยังคงมีความเกี่ยวข้องอย่างยิ่ง โดยเฉพาะสำหรับเครื่องมือบรรทัดคำสั่งและแอพพลิเคชันเซิร์ฟเวอร์ที่ความแตกต่างระหว่างข้อความบันทึกปกติและข้อผิดพลาดเป็นสิ่งสำคัญ อย่างไรก็ตาม สำหรับการจัดการข้อผิดพลาดที่ซับซ้อนยิ่งขึ้น โดยเฉพาะในแอพพลิเคชันที่มี GUI หรือที่ต้องการกลไกการบันทึกที่ซับซ้อนยิ่งขึ้น โปรแกรมเมอร์อาจใช้ไลบรารีการบันทึกที่เฉพาะเจาะจงซึ่งให้การควบคุมที่ดีกว่าเกี่ยวกับการจัดรูปแบบข้อความ ปลายทาง (เช่น ไฟล์ ตามเครือข่าย) และระดับความรุนแรง (ข้อมูล คำเตือน ข้อผิดพลาด ฯลฯ)

ในขณะที่ stderr ให้กลไกพื้นฐานสำหรับการรายงานข้อผิดพลาดในภาษา C การพัฒนาของปฏิบัติการโปรแกรมและการมีอยู่ของเฟรมเวิร์กการบันทึกขั้นสูงหมายความว่ามันมักเป็นเพียงจุดเริ่มต้นสำหรับกลยุทธ์การจัดการข้อผิดพลาดสมัยใหม่