Sudah ada beberapa jawaban di sini, tetapi inilah jawaban yang memperhitungkan Unity3D (jawabannya sangat spesifik untuk Unity3D, saya akan melakukan sebagian besar ini sangat berbeda dalam sebagian besar konteks):
Secara umum, Unity3D tidak menggunakan pengecualian secara tradisional. Jika Anda melemparkan pengecualian di Unity3D, itu tidak seperti di aplikasi .NET rata-rata Anda, yaitu tidak akan menghentikan program, t sebagian besar Anda dapat mengkonfigurasi editor untuk berhenti. Itu hanya akan login. Ini dapat dengan mudah membuat game dalam keadaan tidak valid dan membuat efek kaskade yang membuat kesalahan sulit dilacak. Jadi saya akan mengatakan dalam kasus Unity, membiarkan Add
melemparkan pengecualian adalah opsi yang sangat tidak diinginkan.
Tetapi pada pemeriksaan kecepatan pengecualian bukanlah kasus optimasi prematur dalam beberapa kasus karena cara kerja Mono di Unity pada beberapa platform. Faktanya, Unity3D di iOS mendukung beberapa optimasi skrip tingkat lanjut, dan pengecualian yang dinonaktifkan * adalah efek samping dari salah satunya. Ini benar-benar sesuatu yang perlu dipertimbangkan karena optimasi itu terbukti sangat berharga bagi banyak pengguna, menunjukkan kasus yang realistis untuk mempertimbangkan membatasi penggunaan pengecualian di Unity3D. (* pengecualian terkelola dari mesin, bukan kode Anda)
Saya akan mengatakan bahwa di Unity Anda mungkin ingin mengambil pendekatan yang lebih khusus. Ironisnya, jawaban yang sangat rendah pada saat penulisan ini , menunjukkan satu cara saya dapat menerapkan sesuatu seperti ini secara khusus dalam konteks Unity3D (di tempat lain sesuatu seperti ini benar-benar tidak dapat diterima, dan bahkan dalam Unity itu cukup tidak elegan).
Pendekatan lain yang saya pertimbangkan sebenarnya tidak menunjukkan kesalahan sejauh pemanggil yang bersangkutan, melainkan menggunakan Debug.LogXX
fungsi. Dengan begitu Anda mendapatkan perilaku yang sama seperti melempar pengecualian yang tidak ditangani (karena cara Unity3D menangani mereka) tanpa risiko menempatkan sesuatu dalam keadaan aneh di telepon. Juga pertimbangkan apakah ini benar-benar kesalahan (Sedang mencoba memuat materi yang sama dua kali berarti kesalahan dalam kasus Anda? Atau mungkin ini kasus Debug.LogWarning
yang lebih dapat diterapkan).
Dan sehubungan dengan penggunaan hal-hal seperti Debug.LogXX
fungsi alih-alih pengecualian, Anda masih harus mempertimbangkan apa yang terjadi ketika pengecualian akan dilemparkan dari sesuatu yang mengembalikan nilai (seperti GetMaterial). Saya cenderung untuk mendekati ini dengan melewatkan nol bersamaan dengan mencatat kesalahan ( sekali lagi, hanya di Unity ). Saya kemudian menggunakan cek nol di MonoBehaviors saya untuk memastikan setiap dependensi seperti materi bukan nilai nol, dan menonaktifkan MonoBehavior jika itu. Contoh untuk perilaku sederhana yang memerlukan beberapa dependensi adalah sesuatu seperti ini:
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<>
mirip dengan contoh Anda dalam hal ini memanggil fungsi pada kamus yang melempar pengecualian. Tapi alih-alih melempar pengecualian yang digunakannya Debug.LogError
yang memberikan jejak stack seperti pengecualian normal dan mengembalikan null. Pemeriksaan yang mengikuti * akan menonaktifkan perilaku alih-alih membiarkannya terus ada dalam keadaan tidak valid.
* cek terlihat seperti itu karena pembantu kecil yang saya gunakan yang mencetak pesan yang diformat ketika menonaktifkan objek game **. Cek nol sederhana dengan if
kerja di sini (** cek pembantu hanya dikompilasi di build Debug (seperti yang ditegaskan). Menggunakan lambdas dan ekspresi seperti itu di Unity dapat mengurangi kinerja)
_Materials.Add
melempar pengecualian?