ใครควรอ่านข้อยกเว้นข้อความถ้าทั้งหมด


27

เมื่อออกแบบข้อยกเว้นฉันควรเขียนข้อความที่ผู้ใช้หรือนักพัฒนาควรเข้าใจหรือไม่ ใครควรเป็นผู้อ่านข้อความข้อยกเว้น?

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

มันจะดีกว่าไหมถ้าจะไม่เขียนข้อความเลย แต่มีตัวสร้างข้อยกเว้นพิเศษที่ดูแลการสร้างข้อความที่มีความหมายซึ่งอาจเป็นภาษาต่าง ๆ แทนที่จะเขียนรหัสเป็นรหัส?


ฉันถูกถามว่าคำถามเหล่านี้ตอบคำถามของฉันหรือไม่:

ฉันอ่านทั้งคู่แล้วและฉันก็ไม่พอใจกับคำตอบของพวกเขา พวกเขาพูดคุยเกี่ยวกับผู้ใช้ทั่วไปและมุ่งเน้นไปที่เนื้อหาของข้อความแทนที่จะเป็นผู้รับและปรากฎว่ามีอย่างน้อยสองคนนั่นคือผู้ใช้ปลายทางและนักพัฒนา ฉันไม่เคยรู้ว่าฉันควรพูดคุยกับใครเมื่อเขียนข้อความยกเว้น

ฉันยังคิดว่าข้อความที่โด่งดังไม่ได้มีคุณค่าใด ๆ เลยเพราะเพียงแค่พูดซ้ำประเภทของข้อยกเว้นด้วยคำที่แตกต่างกันดังนั้นทำไมต้องเขียนพวกเขาด้วยซ้ำ? ฉันสามารถสร้างมันได้อย่างสมบูรณ์แบบโดยอัตโนมัติ

ข้อความถึงฉันยกเว้นไม่มีความแตกต่างของผู้อ่าน สมบูรณ์ยกเว้นจะต้องให้อย่างน้อยสองรุ่นของข้อความ: หนึ่งสำหรับผู้ใช้ขั้นปลายและหนึ่งสำหรับนักพัฒนา เรียกมันว่าข้อความแค่ข้อความธรรมดาเกินไป ข้อความนักพัฒนาซอฟต์แวร์ควรเขียนเป็นภาษาอังกฤษ แต่อาจต้องแปลข้อความของผู้ใช้เป็นภาษาอื่น มันเป็นไปไม่ได้ที่จะบรรลุทั้งหมดนี้ด้วยข้อความเดียวดังนั้นข้อยกเว้นจะต้องให้ตัวระบุบางอย่างกับข้อความของผู้ใช้ปลายทางอย่างที่ฉันเพิ่งพูดไปว่าอาจมีให้บริการในภาษาต่าง ๆ

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


4
มีคำถามอีกสองคำถามที่ถามเกี่ยวกับโปรแกรมเมอร์ที่เข้ามาในใจ ฉันไม่แน่ใจว่าพวกเขาจะซ้ำกันหรือไม่ แต่ฉันคิดว่าคุณควรอ่านพวกเขาและบางทีพวกเขาจะตอบข้อกังวลของคุณบางส่วนหรือทั้งหมด: วิธีการเขียนข้อความยกเว้นที่ดีและทำไมข้อความข้อยกเว้นจำนวนมากไม่มีรายละเอียดที่เป็นประโยชน์ ?
โธมัสโอเวนส์

2
@ThomasOwens ฉันได้อ่านพวกเขาทั้งสอง แต่พวกเขาไม่ได้ระบุผู้รับที่เฉพาะเจาะจงของข้อความข้อยกเว้น พวกเขาพูดถึงผู้ใช้ทั่วไป แต่เขาเป็นใคร เป็นผู้ใช้ซอฟต์แวร์ที่ตอนนี้มีความคิดเกี่ยวกับการเขียนโปรแกรมหรือนักพัฒนาที่ควรวิเคราะห์สิ่งที่ผิดพลาดหรือไม่? ฉันไม่เคยแน่ใจว่าฉันควรจะอยู่กับใครเมื่อเขียนข้อความ
t3chb0t

2
ฉันคิดว่าคำตอบที่ดีอาจหมายถึงคำถามใดคำถามหนึ่งหรือทั้งสองข้อ แต่พวกเขาอยู่ไกลจากคำซ้ำซ้อน
การแข่งขัน Lightness กับโมนิก้า

1
ทำไมบนโลกนี้จึงปิดเหมือนซ้ำกัน แม้ว่าจะเป็นคำถามที่ซ้ำกันของคำถามอื่น (ซึ่งไม่ใช่) แต่คำถามนี้มีคำตอบที่ดีกว่าอย่างชัดเจน แต่ควรเป็นคำถามอื่นที่ทำเครื่องหมายว่าซ้ำกัน
Ben Aaronson

2
@MichaelT ฉันยังไม่เห็นการทับซ้อนกันมากนักเว้นแต่คุณจะสันนิษฐานว่าข้อความยกเว้นมีไว้สำหรับผู้ใช้
Ben Aaronson

คำตอบ:


46

ข้อความเหล่านี้มีไว้สำหรับนักพัฒนาอื่น ๆ

นักพัฒนาคาดว่าจะสามารถอ่านข้อความเหล่านี้ได้เพื่อช่วยในการดีบักแอปพลิเคชัน สิ่งนี้มีสองรูปแบบ:

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

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

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

ตัวอย่างเช่นIOSecurityExceptionชนิดของข้อผิดพลาดเกิดขึ้นเมื่อเขียนไฟล์ไม่ชัดเจนมากเกี่ยวกับปัญหา: เป็นเพราะเราไม่มีสิทธิ์ในการเข้าถึงไฟล์หรือไม่ หรือบางทีเราสามารถอ่านได้ แต่ไม่ใช่เขียน? หรืออาจไม่มีไฟล์อยู่และเราไม่มีสิทธิ์ในการสร้างไฟล์ที่นั่น หรืออาจถูกล็อค (หวังว่าประเภทของข้อยกเว้นจะแตกต่างกันในกรณีนี้ แต่ในทางปฏิบัติบางครั้งประเภทอาจเป็นความลับ) หรือบางทีความปลอดภัยในการเข้าถึงรหัสทำให้เราไม่สามารถทำงาน I / O ได้?

แทน:

IOSecurityException: พบไฟล์ แต่สิทธิ์ในการอ่านเนื้อหาถูกปฏิเสธ

ชัดเจนมากขึ้น ที่นี่เรารู้ทันทีว่าการอนุญาตในไดเรกทอรีถูกตั้งค่าอย่างถูกต้อง (ไม่เช่นนั้นเราจะไม่สามารถรู้ได้ว่ามีไฟล์อยู่) แต่การอนุญาตที่ระดับไฟล์นั้นเป็นปัญหา

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

โปรดทราบว่าสำหรับเหตุผลทางเทคนิค (มักจะมีประสิทธิภาพ) ข้อความบางข้อความอาจมีความลับมากกว่าที่ควรเป็น . NET's NullReferenceException:

การอ้างอิงวัตถุไม่ได้ถูกตั้งค่าเป็นอินสแตนซ์ของวัตถุ

เป็นตัวอย่างที่ดีของข้อความที่ไม่เป็นประโยชน์ ข้อความที่เป็นประโยชน์จะเป็น:

วัตถุการอ้างอิงที่ไม่ได้กำหนดให้ตัวอย่างของวัตถุเมื่อเรียกproductproduct.Price

ข้อความเหล่านั้นไม่ได้มีไว้สำหรับผู้ใช้ปลายทาง!

ผู้ใช้ปลายทางไม่คาดว่าจะเห็นข้อความข้อยกเว้น ไม่เคย แม้ว่านักพัฒนาซอฟต์แวร์บางรายจะแสดงข้อความเหล่านั้นแก่ผู้ใช้ แต่สิ่งนี้นำไปสู่ประสบการณ์การใช้งานที่ไม่ดี ข้อความเช่น:

การอ้างอิงวัตถุไม่ได้ถูกตั้งค่าเป็นอินสแตนซ์ของวัตถุ

ไม่มีความหมายอะไรกับผู้ใช้อย่างแน่นอนและควรหลีกเลี่ยงค่าใช้จ่ายทั้งหมด

สถานการณ์กรณีที่เลวร้ายที่สุดคือการลอง / จับทั่วโลกซึ่งจะส่งข้อยกเว้นให้ผู้ใช้และออกจากแอป แอปพลิเคชันที่ใส่ใจผู้ใช้:

  • จัดการข้อยกเว้นในตอนแรก คนส่วนใหญ่สามารถจัดการได้โดยไม่รบกวนผู้ใช้ เครือข่ายขัดข้อง ทำไมไม่รอสักครู่แล้วลองใหม่อีกครั้ง

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

  • เชิญผู้ใช้ให้ดำเนินการในรูปแบบที่ไม่ใช่ข้อผิดพลาด ไม่มีสิทธิ์เพียงพอในการเข้าถึงไฟล์หรือไม่ ทำไมไม่ขอให้ผู้ใช้ให้สิทธิ์การดูแลระบบหรือเลือกไฟล์อื่น

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

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

    การหารด้วยศูนย์เกิดขึ้น [ตกลง]

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

    ฟิลด์ D13 ไม่สามารถมีค่าเหมือนกับค่าในฟิลด์ E6 เนื่องจากการลบค่าเหล่านั้นถูกใช้เป็นตัวหาร [ตกลง]

    หรืออาจจะ:

    ค่าที่รายงานโดยบริการ ATP ไม่สอดคล้องกับข้อมูลท้องถิ่น สิ่งนี้อาจเกิดจากข้อมูลในเครื่องไม่ซิงค์กัน คุณต้องการซิงโครไนซ์ข้อมูลการจัดส่งและลองอีกครั้งหรือไม่ [ใช่ไม่ใช่]

ข้อความเหล่านั้นไม่ได้มีไว้สำหรับการแยกวิเคราะห์

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

ลองนึกภาพข้อความข้อยกเว้น:

การเชื่อมต่อกับแคชตัดการหมดเวลาหลังจากรอ 500 ms เพิ่มการหมดเวลาหรือตรวจสอบการตรวจสอบประสิทธิภาพเพื่อระบุการลดลงของประสิทธิภาพเซิร์ฟเวอร์ เวลารอเฉลี่ยสำหรับแคชเซิร์ฟเวอร์คือ 6 ms สำหรับเดือนที่แล้ว 4 ms สำหรับสัปดาห์ที่แล้วและ 377 มิลลิวินาที สำหรับชั่วโมงสุดท้าย

คุณต้องการแยกค่า“ 500”,“ 6”,“ 4” และ“ 377” คิดเล็กน้อยเกี่ยวกับวิธีที่คุณจะใช้ในการแยกวิเคราะห์แล้วอ่านต่อ

คุณมีความคิด? ยิ่งใหญ่

ตอนนี้ผู้พัฒนาดั้งเดิมค้นพบตัวพิมพ์ผิด:

Connecting to the caching sever timed out after waiting [...]

ควรจะเป็น:

                            ↓
Connecting to the caching server timed out after waiting [...]

ยิ่งกว่านั้นนักพัฒนาซอฟต์แวร์เห็นว่าเดือน / สัปดาห์ / หนึ่งชั่วโมงไม่เกี่ยวข้องกันเป็นพิเศษดังนั้นเขาจึงทำการเปลี่ยนแปลงเพิ่มเติม:

เวลารอเฉลี่ยสำหรับแคชเซิร์ฟเวอร์คือ 6 ms สำหรับเดือนที่แล้ว 5 ms ในช่วง 24 ชั่วโมงที่ผ่านมาและ 377 มิลลิวินาที สำหรับชั่วโมงสุดท้าย

เกิดอะไรขึ้นกับการแยกวิเคราะห์ของคุณ

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

{
    message: "Connecting to the caching [...]",
    properties: {
        "timeout": 500,
        "statistics": [
            { "timespan": 1, "unit": "month", "average-timeout": 6 },
            { "timespan": 7, "unit": "day", "average-timeout": 4 },
            { "timespan": 1, "unit": "hour", "average-timeout": 377 },
        ]
    }
}

การใช้ข้อมูลนี้ง่ายแค่ไหน?

บางครั้ง (เช่นภายใน. NET) ข้อความสามารถแปลเป็นภาษาของผู้ใช้ได้ (IMHO การแปลข้อความเหล่านั้นผิดอย่างยิ่งเนื่องจากผู้พัฒนาคาดว่าจะสามารถอ่านภาษาอังกฤษได้) การแยกข้อความดังกล่าวใกล้จะเป็นไปไม่ได้


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

1
@ Neil: นั่นเป็นทฤษฎีมากเกินไป ในทางปฏิบัติประโยชน์จากการซ่อนบันทึกจากผู้ใช้นั้นมีมากกว่าเมื่อเทียบกับความซับซ้อนของการบันทึกออนไลน์ ไม่นับแง่มุมที่เป็นมิตรของผู้ใช้ ลองนึกภาพว่าคุณกำลังติดตั้ง Visual Studio บน Windows VM ใหม่ของคุณ ทันใดนั้นการติดตั้งล้มเหลว คุณต้องการเพียงแค่ไปที่บันทึกและวิเคราะห์ปัญหาด้วยตัวเอง (ด้วยความช่วยเหลือของ Stack Exchange และบล็อก) หรือรอจนกว่า Microsoft จะแก้ปัญหาและเผยแพร่โปรแกรมแก้ไขด่วนหรือไม่
Arseni Mourzenko

4
ฉันคิดว่าทุกคนทราบว่าข้อความ "การอ้างอิงวัตถุ ... " นั้นไม่ช่วยเหลือ คำถามที่เกี่ยวข้องคือรหัสเครื่องที่คุณต้องการให้ผู้สร้างสร้างข้อความที่คุณต้องการ? ถ้าคุณทำเช่นการออกกำลังกายนี้คุณอย่างรวดเร็วพบว่าข้อความที่ไม่สามารถสร้างได้อย่างง่ายดายโดยไม่ต้องมหาศาลค่าใช้จ่ายในการปฏิบัติงานที่กำหนดไว้ในทุกกรณีที่ไม่โดดเด่น ประโยชน์ของการทำให้งานของนักพัฒนาที่ประมาทง่ายขึ้นเล็กน้อยนั้นไม่ได้รับค่าตอบแทนจากประสิทธิภาพที่ผู้ใช้งานได้รับ
Eric Lippert

7
เกี่ยวกับข้อยกเว้นด้านความปลอดภัย: ข้อมูลน้อยลงในข้อยกเว้นที่ดีกว่า เกร็ดเล็กเกร็ดน้อยที่ฉันชอบคือใน NET 1.0 รุ่นพรีเบต้าคุณอาจได้รับข้อความแสดงข้อยกเว้นเช่น "คุณไม่ได้รับอนุญาตให้ระบุชื่อไฟล์ C: \ foo.txt" เยี่ยมมากขอบคุณสำหรับข้อความแสดงข้อยกเว้นโดยละเอียด!
Eric Lippert

2
ฉันไม่เห็นด้วยกับการไม่แสดงข้อความข้อผิดพลาดอย่างละเอียดแก่ผู้ใช้ มันเกิดขึ้นกับฉันหลายครั้งที่ฉันได้รับข้อความแสดงข้อผิดพลาดที่เป็นความลับทำให้ฉันไม่สามารถเริ่มเกม / ซอฟต์แวร์ของฉันได้ แต่เมื่อฉัน google ฉันพบว่ามีวิธีแก้ปัญหาง่ายๆ หากไม่มีข้อความแสดงข้อผิดพลาดจะไม่มีวิธีในการหาวิธีแก้ไข อาจเป็นการดีกว่าที่จะซ่อนรายละเอียดไว้ใต้ปุ่ม "รายละเอียดเพิ่มเติม"
BlueRaja - Danny Pflughoeft

2

คำตอบนี้ขึ้นอยู่กับข้อยกเว้นทั้งหมด

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

อย่างไรก็ตามส่วนใหญ่ผู้ใช้จะไม่สามารถแก้ไขข้อยกเว้นที่ไม่ได้ตรวจสอบได้ ส่วนใหญ่เกี่ยวข้องกับการเปลี่ยนแปลงรหัส ในกรณีเหล่านี้ผู้ใช้ข้อความเป็นผู้พัฒนาอย่างชัดเจน

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

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


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

@MainMa คุณอาจไม่ทราบบริบทอย่างชัดเจน แต่มีคำแนะนำมากมาย ตัวอย่างเช่นหากพวกเขากำลังอยู่ในขั้นตอนการเปิดไฟล์และข้อยกเว้นคือ "IOError: การอนุญาตถูกปฏิเสธ" มีโอกาสพอสมควรที่ผู้ใช้สามารถใส่ 2 และ 2 เข้าด้วยกันและหาไฟล์ที่เป็นปัญหา โปรแกรมแก้ไขรายการโปรดของฉันทำสิ่งนี้ - เพียงแค่แสดงข้อความข้อยกเว้นในกล่องโต้ตอบไม่มีขุย ในทางตรงกันข้ามถ้าฉันกำลังโหลดแอปพลิเคชันของฉันและได้รับ "ปฏิเสธสิทธิ์" ในขณะที่โหลดรูปภาพจำนวนมากมันมีเหตุผลที่น้อยกว่ามากที่ผู้ใช้จะสามารถทำอะไรกับข้อมูลได้
Cort Ammon - Reinstate Monica

เถียงจุดของคุณผมไม่เคยเห็นค่าใด ๆ ในการแสดงผู้ใช้ NullReferenceException อื่น ๆ กว่าว่ากระทำเพียงการแสดงที่แสดงข้อความว่าซอฟต์แวร์ของคุณไม่ได้มีเงื่อนงำวิธีการกู้คืน! ข้อความแสดงข้อยกเว้นนั้นไม่มีประโยชน์สำหรับผู้ใช้
Cort Ammon - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.