เป็นการดีที่จะใช้ NoStackTrace ใน scala หรือไม่


11

ฉันเจอNoStackTraceมิกซ์อินสำหรับข้อยกเว้นในงานกาลา

มันเป็นการปฏิบัติที่ดีที่จะใช้หรือควรพิจารณาว่า "ภายใน" เพื่อสกาล่าและทิ้งไว้ตามลำพัง?

คำตอบ:


14

รอสักครู่ให้ตรงไปที่ Stack Overflow - ข้อยกเว้น Java ช้าแค่ไหน

ปรากฎว่าส่วนที่มีราคาแพงของการโยนข้อยกเว้นคือประชากรของการติดตามสแต็กที่ไปพร้อมกับข้อยกเว้น

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

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

พิจารณาสถานการณ์ที่คุณได้มี String จากแหล่งบางและคุณต้องการที่จะได้รับมันกลับเข้ามาในรูปแบบจำนวนเต็มกับInteger.decode

Integer foo = Integer.decode(str);

แต่ที่พ่นตรวจสอบdecode NumberFormatExceptionตกลง...

Integer foo;
try {
    foo = Integer.decode(str);
} catch (NumberFromatException e) {
    // raise an error back to the input form
}

แต่คุณไม่สนใจเกี่ยวกับการติดตามสแต็กที่นั่น ... แต่มันอยู่ที่นั่น และช้าลงเล็กน้อยเพราะมันเติมสแต็กการติดตาม

ดังนั้นในสกาล่าคุณมีNoStackTrace:

คุณลักษณะสำหรับข้อยกเว้นซึ่งสำหรับเหตุผลด้านประสิทธิภาพอย่ากรอกข้อมูลในการติดตามสแต็ก การยับยั้งการติดตามสแต็กสามารถปิดใช้งานได้ทั่วโลกผ่านทางตัวห่อคุณสมบัติระบบใน scala.sys.SystemProperties

อย่าเติมสิ่งที่คุณไม่ต้องการ คุณไม่สนใจเกี่ยวกับการติดตามสแต็กเพราะคุณจัดการที่นั่นแล้ว นี่ไม่ใช่สิ่งที่กำลังผ่านพ้นไปและไม่ใช่ทั้งหมดที่พิเศษเช่นกัน

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

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