05 Juni 2009

Exception, try except, try finally

Exception
Exception merupakan kesalahan yang terjadi pada saat runtime. Kesalahan yang terjadi bisa berbagai macam, misalnya saat melakukan konversi nilai yang tidak valid dari string ke integer, atau saat melakukan pembagian dengan pembagi 0. Exception tidak hanya dibangkitkan untuk kejadian seperti diatas. Kita bisa juga membangkitkan kesalahan saat suatu kondisi yang diinginkan tidak terpenuhi. Misalnya saat kita meminta input berupa nilai integer yang lebih besar dari 1. Jika kurang dari 1, maka tampilkan pesan kesalahan.
Exception pada Delphi berupa class yang mempunyai properti dan method, seperti EConvertError, EDivByZero dan lain-lain. Jadi memanggil exception berarti memanggil obyek yang dihasilkan dari class.
Menampilkan pesan bisa dengan rutin yang disediakan seperti ShowMessage() atau MessageDlg(). Kelemahan dari rutin tersebut adalah tidak menjamin baris kode yang dibawahnya tidak akan dijalankan. Meskipun bisa dengan melakukan pengecekan kondisi dengan if then else, tapi tidak efektif. Dengan perintah raise, dijamin baris kode yang terdapat dibawahnya tidak akan dijalankan. Pada contoh ini, Proc3() dan Proc4() tidak akan dijalankan dan akan menampilkan pesan kesalahan jika isi variabel Nilai lebih kecil dari 1.
var
  Nilai: Integer;
begin
  Proc1();
  Proc2();
  if Nilai < 1 then
    raise Exception.Create('Nilai harus lebih besar dari 0');
  Proc3();
  Proc4();
end;

Try except
Blok try except digunakan untuk penanganan kesalahan pada Delphi dan dapat digunakan pada baris kode yang mempunyai potensi terjadi kesalahan saat dijalankan. Saat terjadi kesalahan pada saat runtime, Delphi akan membuat obyek, yaitu exception, kemudian akan mengembalikan stack ke posisi awal yang ditemukan dimana terdapat baris kode untuk penanganan kesalahan. Tanpa adanya blok try except, exception dapat menyebabkan keluar dari rutin atau pada jika terdapat pada main program dapat menyebabkan keluar dari program, yang berarti baris perintah/kode yang terdapat dibawahnya tidak dijalankan. Dengan adanya blok try except, kita bisa melakukan penanganan terhadap exception, misalnya dengan menampilkan pesan sesuai dengan yang kita inginkan.
try
  ShowMessage(IntToStr(StrToInt(Edit1.Text) div StrToInt(Edit2.Text)));
except
  on EConvertError do
    raise Exception.Create('Masukkan input berupa nilai integer');
  on EDivByZero do
    raise Exception.Create('Pembagi tidak boleh 0');
  on E: Exception do
  begin
    //...
    raise Exception.Create(E.Message);
  end;
end;


Try finally
Kadang kita ingin memastikan suatu perintah dijalankan, meski terdapat suatu exception. Blok try finally dapat memastikan suatu perintah dijalankan meskipun terdapat exception. Contoh dibawah terdapat fungsi yang membaca file teks pada baris pertama dan mengembalikan nilai dengan tipe integer. Jika terjadi exception pada blok try finally, misal kesalahan saat konversi, dipastikan perintah setelah kata kunci finally akan dijalankan.
function BacaFile: Integer;
var
  txtfile: TextFile;
  buf: string;
begin
  AssignFile(txtfile, 'C:\fileteks.txt');
  try
    Reset(txtfile);
    Readln(txtfile, buf);
    Result := StrToInt(buf);
  finally
    CloseFile(txtfile);
  end;
end;

Kita bisa juga menggabungkan blok try except dan try finally atau membuatnya bersarang.
try
  AssignFile(txtfile, 'C:\fileteks.txt');
  try
    Reset(txtfile);
    Readln(txtfile, buf);
    Result := StrToInt(buf);
  finally
    CloseFile(txtfile);
  end;
except
  on E: Exception do
    raise Exception.Create(E.Message);
end;

Catatan: Delphi mempunyai procedure Abort() yang membangkitkan exception EAbort, yang berfungsi seperti exception, tapi tanpa menampilkan pesan kesalahan pada user.

4 komentar: