ในแอปพลิเคชันของฉันฉันใช้รหัสผ่าน PMD มันแสดงข้อความนี้ให้ฉัน:
- หลีกเลี่ยง printStackTrace (); ใช้การโทรคนตัดไม้แทน
นั่นหมายความว่าอย่างไร?
ในแอปพลิเคชันของฉันฉันใช้รหัสผ่าน PMD มันแสดงข้อความนี้ให้ฉัน:
- หลีกเลี่ยง printStackTrace (); ใช้การโทรคนตัดไม้แทน
นั่นหมายความว่าอย่างไร?
คำตอบ:
หมายความว่าคุณควรใช้กรอบการบันทึกเช่น ย้อนกลับ หรือ log4j และแทนที่จะพิมพ์ข้อยกเว้นโดยตรง:
e.printStackTrace();
คุณควรบันทึกโดยใช้ API ของกรอบงานนี้:
log.error("Ops!", e);
เฟรมเวิร์กการบันทึกช่วยให้คุณมีความยืดหยุ่นอย่างมากเช่นคุณสามารถเลือกได้ว่าคุณต้องการเข้าสู่คอนโซลหรือไฟล์หรืออาจข้ามข้อความบางข้อความหากคุณพบว่าไม่เกี่ยวข้องอีกต่อไปในบางสภาพแวดล้อม
หากคุณเรียกprintStackTrace()
หาข้อยกเว้นการติดตามจะถูกเขียนSystem.err
และยากที่จะกำหนดเส้นทางไปที่อื่น (หรือกรอง) แทนที่จะทำเช่นนี้คุณควรใช้เฟรมเวิร์กการบันทึก (หรือ wrapper รอบ ๆ เฟรมเวิร์กการบันทึกหลาย ๆ เฟรมเช่น Apache Commons Logging) และบันทึกข้อยกเว้นโดยใช้เฟรมเวิร์กนั้น (เช่นlogger.error("some exception message", e)
)
การทำเช่นนั้นช่วยให้คุณ:
โปรแกรมคุณภาพการผลิตควรใช้หนึ่งในทางเลือกในการบันทึก (เช่น log4j, logback, java.util.logging) เพื่อรายงานข้อผิดพลาดและการวินิจฉัยอื่น ๆ สิ่งนี้มีข้อดีหลายประการ:
ในทางตรงกันข้ามถ้าคุณใช้ printStackTrace ผู้ปรับใช้ / ผู้ใช้ปลายทางจะมีการควบคุมเพียงเล็กน้อยและข้อความการบันทึกอาจสูญหายหรือแสดงต่อผู้ใช้ปลายทางในสถานการณ์ที่ไม่เหมาะสม (และไม่มีอะไรทำให้ผู้ใช้ขี้อายมากไปกว่าการติดตามสแต็กแบบสุ่ม)
ใน Simple e.printStackTrace () ไม่ใช่แนวทางปฏิบัติที่ดีเนื่องจากเพิ่งพิมพ์ stack trace เป็นข้อผิดพลาดมาตรฐาน ด้วยเหตุนี้คุณจึงไม่สามารถควบคุมได้ว่าผลลัพธ์นี้จะไปที่ใด
เกือบทุกเฟรมเวิร์กการบันทึกมีวิธีการที่เราสามารถส่งผ่านวัตถุที่สามารถโยนได้พร้อมกับข้อความ ชอบ:
public trace(Marker marker, String msg, Throwable t);
พวกเขาพิมพ์ stacktrace ของวัตถุที่สามารถโยนได้
มาพูดคุยกันในแนวคิดของ บริษัท บันทึกช่วยให้คุณมีระดับที่ยืดหยุ่นได้ (ดูความแตกต่างระหว่าง logger.info และ logger.debug ) ผู้คนต่างต้องการเห็นระดับที่แตกต่างกันเช่น QA นักพัฒนานักธุรกิจ แต่ e.printStackTrace () จะพิมพ์ทุกอย่าง นอกจากนี้เช่นหากเรียกวิธีนี้อย่างสงบข้อผิดพลาดเดียวกันนี้อาจพิมพ์ได้หลายครั้ง จากนั้นคน Devops หรือ Tech-Ops ใน บริษัท ของคุณอาจบ้าคลั่งเพราะพวกเขาจะได้รับการแจ้งเตือนข้อผิดพลาดเดียวกัน ฉันคิดว่าการทดแทนที่ดีกว่าอาจเป็นได้log.error("errors happend in XXX", e)
นอกจากนี้ยังจะพิมพ์ข้อมูลทั้งหมดซึ่งอ่านง่ายกว่า e.printStackTrace ()
สาเหตุหลักคือ Proguard จะลบการโทรบันทึกออกจากการผลิต เนื่องจากด้วยการบันทึกหรือพิมพ์ StackTrace จึงเป็นไปได้ที่จะเห็นข้อมูลเหล่านี้ (ข้อมูลภายใน stack trace หรือ Log) ภายในโทรศัพท์ Android โดยตัวอย่างเช่นแอปพลิเคชัน Logcat Reader เพื่อให้เป็นการปฏิบัติที่ไม่ดีต่อความปลอดภัย. นอกจากนี้เราไม่สามารถเข้าถึงได้ในระหว่างการผลิตการลบออกจากการผลิตจะดีกว่า เนื่องจาก ProGuard ลบการเรียกบันทึกทั้งหมดที่ไม่ใช่ stackTrace ดังนั้นจึงเป็นการดีกว่าที่จะใช้บล็อก Log in catch และปล่อยให้นำออกจาก Production โดย Proguard