มีคำตอบอยู่สองสามข้อแล้ว แต่นี่เป็นคำตอบที่คำนึงถึง Unity3D (คำตอบนั้นเฉพาะเจาะจงมากกับ Unity3D ฉันจะทำสิ่งนี้แตกต่างกันมากในบริบทส่วนใหญ่):
โดยทั่วไป Unity3D ไม่ได้ใช้ข้อยกเว้นแบบดั้งเดิม หากคุณมีข้อยกเว้นใน Unity3D จะไม่มีอะไรเหมือนในแอปพลิเคชั่น. NET เฉลี่ยของคุณนั่นคือมันจะไม่หยุดโปรแกรมส่วนใหญ่คุณสามารถกำหนดค่าตัวแก้ไขให้หยุดชั่วคราว มันจะถูกบันทึก สิ่งนี้สามารถทำให้เกมอยู่ในสถานะที่ไม่ถูกต้องและสร้างเอฟเฟกต์น้ำตกที่ทำให้เกิดข้อผิดพลาดที่ยากต่อการติดตาม ดังนั้นฉันจะบอกว่าในกรณีของ Unity การปล่อยให้Add
ข้อยกเว้นเป็นตัวเลือกที่ไม่พึงประสงค์อย่างยิ่ง
แต่ในการตรวจสอบความเร็วของข้อยกเว้นไม่ใช่กรณีของการปรับให้เหมาะสมก่อนกำหนดในบางกรณีเนื่องจากการทำงานของโมโนใน Unity ในบางแพลตฟอร์ม ในความเป็นจริง Unity3D บน iOS รองรับการปรับแต่งสคริปต์ขั้นสูงและข้อยกเว้นที่ปิดใช้งาน * เป็นผลข้างเคียงของหนึ่งในนั้น นี่เป็นสิ่งที่ควรพิจารณาเนื่องจากการปรับแต่งเหล่านั้นพิสูจน์แล้วว่ามีคุณค่ามากสำหรับผู้ใช้หลายคนแสดงให้เห็นถึงกรณีที่เป็นจริงสำหรับการพิจารณา จำกัด การใช้ข้อยกเว้นใน Unity3D (* ข้อยกเว้นที่จัดการจากเครื่องยนต์ไม่ใช่รหัสของคุณ)
ฉันจะบอกว่าใน Unity คุณอาจต้องการแนวทางพิเศษเพิ่มเติม กระแทกแดกดันคำตอบลงคะแนนมากในขณะที่เขียนนี้แสดงวิธีหนึ่งที่ฉันอาจใช้บางสิ่งเช่นนี้โดยเฉพาะในบริบทของ Unity3D (ที่อื่น ๆ เช่นนี้ไม่สามารถยอมรับได้จริงและแม้ใน Unity มันค่อนข้างไม่เหมาะสม)
อีกวิธีที่ฉันจะพิจารณาก็คือไม่ได้ระบุข้อผิดพลาดในขณะที่ผู้โทรเข้ามาเกี่ยวข้อง แต่ใช้Debug.LogXX
ฟังก์ชั่นแทน ด้วยวิธีนี้คุณจะได้รับพฤติกรรมเช่นเดียวกับการโยนข้อยกเว้นที่ไม่สามารถจัดการได้ (เพราะ Unity3D จัดการกับพวกมัน) โดยไม่ต้องเสี่ยงทำให้บางสิ่งอยู่ในสถานะที่แปลกลงมา นอกจากนี้ให้พิจารณาด้วยว่านี่เป็นข้อผิดพลาดจริง ๆ (พยายามโหลดเนื้อหาเดียวกันซ้ำสองครั้งจำเป็นต้องมีข้อผิดพลาดในกรณีของคุณหรือไม่หรืออาจเป็นกรณีที่เหมาะสมDebug.LogWarning
กว่า)
และเกี่ยวกับการใช้สิ่งต่าง ๆ เช่นDebug.LogXX
ฟังก์ชั่นแทนที่จะเป็นข้อยกเว้นคุณยังต้องพิจารณาว่าจะเกิดอะไรขึ้นเมื่อมีข้อยกเว้นเกิดขึ้นจากสิ่งที่ส่งคืนค่า (เช่น GetMaterial) ฉันมักจะวิธีนี้โดยผ่าน null พร้อมกับบันทึกข้อผิดพลาด ( อีกครั้งเฉพาะใน Unity ) จากนั้นฉันจะใช้การตรวจสอบโมฆะใน MonoBeh พฤติกรรมของฉันเพื่อให้แน่ใจว่าการพึ่งพาใด ๆ เช่นวัสดุไม่ใช่ค่า null และปิดการใช้งาน MonoBehavior หากเป็น ตัวอย่างสำหรับพฤติกรรมแบบง่าย ๆ ที่ต้องมีการพึ่งพากันสองสามอย่างคือ:
public void Awake()
{
_inputParameters = GetComponent<VehicleInputParameters>();
_rigidbody = GetComponent<Rigidbody>();
_rigidbodyTransform = _rigidbody.transform;
_raycastStrategySelector = GetComponent<RaycastStrategySelectionBehavior>();
_trackParameters =
SceneManager.InstanceOf.CurrentSceneData.GetValue<TrackParameters>();
this.DisableIfNull(() => _rigidbody);
this.DisableIfNull(() => _raycastStrategySelector);
this.DisableIfNull(() => _inputParameters);
this.DisableIfNull(() => _trackParameters);
}
SceneData.GetValue<>
คล้ายกับตัวอย่างของคุณที่เรียกฟังก์ชันในพจนานุกรมที่มีข้อยกเว้น แต่แทนที่จะโยนข้อยกเว้นจะใช้Debug.LogError
ซึ่งจะให้การติดตามสแต็กเหมือนข้อยกเว้นปกติและจะส่งกลับเป็นโมฆะ การตรวจสอบที่ตามมา * จะปิดใช้งานพฤติกรรมแทนที่จะปล่อยให้มันยังคงอยู่ในสถานะที่ไม่ถูกต้อง
* เช็คดูเหมือนว่าเป็นเพราะผู้ช่วยตัวเล็กฉันใช้มันพิมพ์ข้อความที่จัดรูปแบบเมื่อปิดการใช้งานวัตถุเกม ** การตรวจสอบ null แบบง่าย ๆ กับif
งานที่นี่ (** เช็คของผู้ช่วยรวบรวมเฉพาะใน Debug builds (เช่น asserts) การใช้ lambdas และการแสดงออกเช่นนั้นใน Unity สามารถทำให้ประสิทธิภาพลดลงได้)
_Materials.Add
โยนยกเว้น?