यहाँ पहले से ही कुछ उत्तर दिए गए हैं, लेकिन यहाँ का उत्तर Unity3D को ध्यान में रखता है (यह उत्तर Unity3D के लिए बहुत विशिष्ट है, मैं इसे सबसे अलग संदर्भों में सबसे अलग करूँगा):
सामान्य तौर पर, Unity3D पारंपरिक रूप से अपवादों का उपयोग नहीं करता है। यदि आप Unity3D में एक अपवाद को फेंक देते हैं, तो यह आपके औसत .NET एप्लिकेशन की तरह कुछ भी नहीं है, अर्थात् यह कार्यक्रम को रोक नहीं पाएगा, सबसे अधिक आप संपादक को पॉज़ करने के लिए कॉन्फ़िगर कर सकते हैं। यह सिर्फ लॉग इन होगा। यह आसानी से गेम को अमान्य स्थिति में डाल सकता है और एक कैस्केड प्रभाव पैदा कर सकता है जो त्रुटियों को ट्रैक करने में मुश्किल बनाता है। तो मैं एकता के मामले में कहूंगा, Add
अपवाद को फेंकना एक विशेष रूप से अवांछनीय विकल्प है।
लेकिन अपवादों की गति की जांच करने पर कुछ मामलों में समय से पहले अनुकूलन का मामला नहीं है क्योंकि मोनो कुछ प्लेटफार्मों पर एकता में कैसे काम करता है। वास्तव में, iOS पर Unity3D कुछ उन्नत स्क्रिप्ट अनुकूलन का समर्थन करता है, और अक्षम अपवाद * उनमें से एक का एक साइड इफेक्ट है। यह वास्तव में विचार करने के लिए कुछ है क्योंकि उन ऑप्टिमाइज़ेशन ने कई उपयोगकर्ताओं के लिए बहुत मूल्यवान साबित किया है, जो कि यूनिटी 3 डी में अपवादों के उपयोग को सीमित करने पर विचार करने के लिए एक यथार्थवादी मामला दिखा रहा है। (* इंजन से अपवाद प्रबंधित, आपका कोड नहीं)
मैं कहूंगा कि एकता में आप एक अधिक विशिष्ट दृष्टिकोण लेना चाहते हैं। विडंबना यह है कि इसे लिखने के समय बहुत ही कम जवाब दिया गया , एक तरीका दिखाता है कि मैं विशेष रूप से यूनिटी 3 डी के संदर्भ में कुछ इस तरह से लागू कर सकता हूं (कहीं और ऐसा ही कुछ वास्तव में अस्वीकार्य है, और यहां तक कि एकता में यह काफी अयोग्य है)।
एक अन्य दृष्टिकोण जिस पर मैं विचार करूंगा, वह वास्तव में एक त्रुटि का संकेत नहीं है, क्योंकि कॉलर चिंतित है, बल्कि Debug.LogXX
कार्यों का उपयोग कर रहा है। इस तरह आपको एक अनछुए अपवाद को फेंकने के समान व्यवहार मिलता है (क्योंकि यूनिटी 3 डी उन्हें कैसे संभालती है) बिना किसी जोखिम के रेखा के नीचे एक अजीब स्थिति में डालकर। यह भी विचार करें कि क्या यह वास्तव में एक त्रुटि है (क्या आपके मामले में एक ही सामग्री को दो बार जरूरी लोड करने की कोशिश की जा रही है? या यह ऐसा मामला हो सकता है जहां Debug.LogWarning
अधिक लागू होता है)।
और Debug.LogXX
अपवादों के बजाय फ़ंक्शंस जैसी उपयोग की जाने वाली चीज़ों के संबंध में , आपको अभी भी विचार करना होगा कि क्या होता है जब कोई अपवाद उस चीज़ से फेंका जाएगा जो एक मान लौटाता है (जैसे गेटमेटेरिट)। मैं त्रुटि को लॉग करने के साथ-साथ अशक्त होकर ( फिर से, केवल एकता में ) यह दृष्टिकोण करने के लिए जाता हूं । मैं तब अपने मोनोबोहेवियर्स में अशक्त जांच का उपयोग करता हूं ताकि यह सुनिश्चित हो सके कि सामग्री जैसी कोई निर्भरता शून्य मूल्य नहीं है, और यदि यह है तो मोनोबोएवियर को अक्षम करें। एक सरल व्यवहार के लिए एक उदाहरण जिसके लिए कुछ निर्भरता की आवश्यकता होती है वह कुछ इस तरह है:
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
जो एक सामान्य अपवाद की तरह एक स्टैक ट्रेस देता है और अशक्त देता है। जो चेक * फॉलो करते हैं वे व्यवहार को अमान्य स्थिति में मौजूद रहने देने के बजाय अक्षम कर देंगे।
* चेक इस तरह दिखते हैं कि एक छोटे सहायक की वजह से मैं उस फॉर्मैट संदेश को प्रिंट करता हूं जब यह गेम ऑब्जेक्ट को निष्क्रिय करता है **। if
यहाँ काम के साथ सरल अशक्त चेक (** सहायक के चेक केवल डिबग बिल्ड (जोर की तरह) में संकलित किए जाते हैं। लंबोदा और इस तरह अभिव्यक्ति का उपयोग करना एकता में प्रदर्शन पर टोल ले सकता है)
_Materials.Add
एक अपवाद फेंकता है?