ฉันควรส่งชื่อโปรแกรมเมื่อคำเตือนหรือข้อผิดพลาดเกิดขึ้นหรือไม่


13

หากฉันเขียนสคริปต์หรือโปรแกรมฉันควรส่งออกไปยังชื่อ stderr พร้อมกับคำเตือนหรือข้อความแสดงข้อผิดพลาดหรือไม่? ตัวอย่างเช่น:

./script.sh: Warning! Variable "var" lowered down to 10.

หรือ:

./prog.py: Error! No such file: "file.cfg".

ฉันเข้าใจว่าโดยทั่วไปแล้วมันเป็นเพียงเรื่องของรสนิยม (โดยเฉพาะถ้าคุณเขียนของคุณเองเพื่อตัวเอง) แต่ฉันสงสัยว่ามีอะไรที่ธรรมดาบ้างไหม? ฉันเชื่อว่ายูทิลิตี UNIX / Linux ส่วนใหญ่เขียนชื่อของตัวเองเมื่อมีบางสิ่งเกิดขึ้นดังนั้นจึงเป็นเรื่องที่ดี แต่มีแนวทางหรือกฎที่ไม่ได้พูดวิธีการทำเช่นนั้นและไม่ทำอย่างไร

ตัวอย่างเช่นไม่แนะนำให้ติดตั้งไบนารีภายใต้/usr/bin/แทน/usr/local/bin/หรืออย่างอื่น มีกฎที่คล้ายกันเกี่ยวกับการส่งออกไปยัง stderr? ฉันควรเขียนชื่อตามด้วยโคลอนหรือไม่? หรือเพียงแค่ "เตือน!" และ "ผิดพลาด!" คำ? ฉันไม่พบอะไรเลย แต่อาจมีบางคนบอกให้ฉันรู้ได้

คำถามนี้เป็นคำถามเล็กน้อยเกี่ยวกับวิธีปฏิบัติในการเขียนโปรแกรม แต่ฉันคิดว่ามันเหมาะสมกว่าที่นี่มากกว่าในstackoverflowเนื่องจากเป็นเรื่องเกี่ยวกับประเพณี UNIX / Linux และไม่ใช่โปรแกรมทั่วไป


5
ชื่อโปรแกรมสามารถช่วยในการดีบักแบบสุ่มno such fileจากผู้รู้ว่าโปรแกรมใดในขั้นfoo | bar | bazตอน
thrig

@ thrig ขอบคุณจุดดี ของฉันไม่ควรจะถูกประปา แต่ใครจะรู้ เดาว่าดีกว่าที่จะยึดติดกับพฤติกรรมมาตรฐาน
gsarret

คำตอบ:


16

เป็นเรื่องธรรมดาที่จะบันทึกอาร์กิวเมนต์0 ที่ส่งผ่านไปยังโปรแกรม C mainและใช้เป็นพารามิเตอร์สำหรับperror- สำหรับโปรแกรมอย่างง่าย:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *foo = malloc(9999999999L);
    if (foo == 0)
        perror(argv[0]);
    return 0;
}

เรียกโปรแกรมนั้นว่า "foo" และเรียกใช้มันแสดงให้เห็นถึงจุด:

> ./foo
./foo: Cannot allocate memory

โปรแกรมที่ซับซ้อนอาจเพิ่มลงในข้อความ (หรือใช้เฉพาะชื่อไฟล์ที่ไม่มีพา ธ ) แต่การรักษาชื่อโปรแกรมจะช่วยให้คุณค้นหาว่าโปรแกรมมาจากไหน

ไม่มีแบบแผนที่ยอมรับกันโดยทั่วไปสำหรับข้อความแสดงข้อผิดพลาด แต่บางโปรแกรมที่ใช้กันอย่างแพร่หลาย (เช่น gcc) เพิ่มหมวดหมู่ข้อความเช่น "ข้อผิดพลาด" หรือ "คำเตือน" นี่คือตัวอย่างจากหนึ่งในบันทึกของฉัน:

compiling fld_def (obj_s)
../form/fld_def.c: In function '_nc_Copy_Argument':
../form/fld_def.c:164:14: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
        res = (TypeArgument *)argp;
              ^

ในตัวอย่างนี้ gcc แยกเขตข้อมูลด้วยเครื่องหมายจุดคู่และเพิ่มหมวดหมู่ "คำเตือน" หลังจากชื่อไฟล์หมายเลขบรรทัดหมายเลขคอลัมน์ - และก่อนข้อความจริง แต่มีหลายรูปแบบทำให้มันซับซ้อนสำหรับโปรแกรม (เช่นvi-like-emacs ) เพื่อแยกวิเคราะห์ข้อมูล

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


ขอบคุณสำหรับตัวอย่างฉันได้รับจุด สิ่งที่เกี่ยวกับ "ข้อผิดพลาด" และ "คำเตือน" พวกเขายุ่งเหยิงเอาท์พุท?
gsarret

การแก้ไขครั้งล่าสุดของคุณ - สิ่งที่ฉันคิดเกี่ยวกับ! การใช้งานคืออะไรถ้ามันออกจากข้อความผิดพลาดทันที ขอบคุณอีกครั้ง.
gsarret

8

หากโปรแกรมถูกเรียกใช้โดยเป็นส่วนหนึ่งของสคริปต์ที่มีการเรียกใช้โปรแกรมอื่น ๆ อีกมากมายและหากไม่ได้พิมพ์ชื่อผู้ใช้จะพบว่ามันยากที่จะเข้าใจว่าเกิดข้อผิดพลาดจากที่ใด

(หากข้อผิดพลาดเป็นเงื่อนไขภายในที่ไม่คาดคิดซึ่งอาจต้องมีการดีบักคุณต้องการข้อมูลเพิ่มเติม: ไม่ใช่แค่ชื่อโปรแกรม แต่เป็นไฟล์ต้นฉบับและหมายเลขบรรทัดและอาจเป็น backtrace)


ขอบคุณ ฉันมักจะเขียนโปรแกรมสำหรับตัวเอง (การจำลองเชิงตัวเลข) ดังนั้นมีผู้ใช้เพียงคนเดียว แต่ฉันอาจแบ่งปันให้พวกเขาในวันเดียว พวกเขายังไม่ซับซ้อน (อย่างน้อยก็ตอนนี้) ดังนั้นจึงไม่มีปัญหาในการหาแหล่งที่มาของข้อผิดพลาด แต่ขอบคุณสำหรับคำใบ้อาจมีประโยชน์ในอนาคต
gsarret
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.