Try-Catch merupakan keyword yang digunakan untuk melakukan penanganan error saat suatu kode di eksekusi. Istilah penting yang digunakan adalah :

  • Try = digunakan untuk menandai kemungkinan terjadi error di suatu blok
  • Catch = untuk handle error yang terjadi
  • Exception = jenis error yang terjadi
  • Finally = mengeksekusi perintah setelah try atau catch dilakukan

Alur kerjanya adalah sebagai berikut :
1.) Try akan mendeteksi jika ada error
3.) Jika error muncul, try akan melempar (throw) exception
2.) Catch akan menhandle exception berdasarkan jenisnya
3.) (opsional) Entah terjadi exception atau tidak, finally akan melakukan sesuatu

Gunanya apa sih?
Tanpa menggunakan try-catch, game akan crash karena terdapat error. Namun karena sekarang kita sudah handle dengan try-catch, tidak akan ada crash. Dalam tutorial koneksi database dengan Unity, kita juga menggunakan try-catch pada server PHP kita agar tetap dapat berjalan dengan baik (dan mungkin pada implementasi nyata, mengirimkan notifikasi ke developer bahwa telah terjadi error).


Jenis-Jenis Exception

Ada beberapa jenis exception yang sering kita temui. Saya yakin kamu pasti pernah menjumpainya, tapi mungkin belum tau kalau itu adalah exception. Pada dasarnya seluruh exception adalah sub-class dari objek Exception, kemudian dipisah-pisah sesuai dengan kegunaannya. Contoh jenis jenis exception :

  • Exception = base-class exception
  • IndexOutOfRangeException = mengakses indeks array lebih dari panjangnya
  • NullReferenceException = mengakses objek null

Kamu bisa melihat dokumentasi untuk melihat penjelasan detailnya.


Implementasi

Misalnya terdapat kode berikut :


int[] array = new int[] { 1,2,3};   
Debug.Log(array[4]);

Jika dicoba akan menghasilkan exception karena kita mengakses array lebih panjang dari indeksnya.

Kita terapkan try-catch, sehingga hasilnya :


int[] array = new int[] { 1,2,3};   

try
{
    Debug.Log(array[4]);
}
catch (IndexOutOfRangeException ior)
{
    Debug.Log("Salah akses indeks!");
}

Hasilnya:

Kita juga dapat membuat banyak catch untuk menyesuaikan kemungkinan exception yang terjadi.


        int[] array = new int[] { 1,2,3};
        GameObject go = null;

        try
        {
            go.SetActive(false);
            Debug.Log(array[4]);
        }
        catch(NullReferenceException nre)
        {

        }
        catch (IndexOutOfRangeException ior)
        {
            Debug.Log("Salah akses indeks!");
        }
        catch(Exception e)
        {
            Debug.Log("Ditangkap oleh base exception.");
        }

go.SetActive(false) akan ditangkap oleh NullReferenceException, sedangkan Debug.Log(array[4]) akan ditangkap oleh IndexOutOfRangeException. Jika ada catch yang belum didefinisikan, akan ditangkap oleh Exception.


Membuat Exception Sendiri

Karena Exception adalah sebuah base-class, kita dapat mendefinisikan exception buatan sendiri dengan inheritance. Contoh kita akan membuat exception untuk mendeteksi apakah seseorang sudah cukup umur untuk memiliki SIM.


using UnityEngine;
using System;

public class BelumCukupUmurException : Exception
{
    public BelumCukupUmurException(string message): base(message){}
}


        int umurku = 15;
        if (umurku < 17) throw new BelumCukupUmurException("Anda belum cukup umur!");

Intinya sih ini seperti if-else, tapi lebih keren. Hehe.