Januari 4, 2007

Exception handling Pada Ruby

Posted in ruby pada 9:54 am oleh fuad

Struktur umum Exception Handling pada Ruby:
begin
#kode yang dapat menimbulkan eksepsi
rescue ....
# penanganan eksepsi
rescue
# penganan eksepsi
else
#dieksekusi jika eksespsi tidak dapat ditangkap oleh blok rescue sebelumnya
ensure
#semua eksepsi yang terlempar pasti akan masuk juga ke blok ini
end

opFile = File.open(opName, "w")
begin
while data = socket.read(512)
opFile.write(data)
end
rescue SystemCallError
$stderr.print "IO failed: " + $!
opFile.close
File.delete(opName)
end

Kode yang beresiko melempar eksepsi harus diletakkan antara begin dan end.Setiap ada eksepsi yang dilempar, maka objek eksepsi tesebut akan direference oleh variabel global “$!”. tapi misal jika kita ingin menagkap objek eksepsi tersebut dengan lokal variabel maka bisa dengan meletakkan lokal variabel tersebut pada akhir statemen rescue.

opFile = File.open(opName, "w")
begin
while data = socket.read(512)
opFile.write(data)
end
rescue SystemCallError => test
$stderr.print "IO failed: " + test
opFile.close
File.delete(opName)
end

Multiple Rescue

Pada ruby, dalam satu blok begin..end kita bisa membuat beberapa blok rescue

begin
eval string
rescue SyntaxError, NameError => boom
print "String doesn't compile: " + boom
rescue StandardError => bang
print "Error running script: " + bang
end

Else dan Ensure

Else dieksekusi jika eksepsi yang terlempar tidak ditangkap oleh blok rescue yang ada diatasnya.

f = File.open("testfile")
begin
# .. process
rescue
# .. handle error
else
puts "Congratulations-- no errors!"

Blok ensure selalu dieksekusi jika ada eksepsi yang terelempar.

f = File.open("testfile")
begin
# .. process
rescue
# .. handle error
else
puts "Congratulations-- no errors!"
ensure
f.close unless f.nil?
End

retry

retry digunakan untuk mengulang suatu blok penganan eksepsi

f = File.open("testfile")
begin
f.write(1)
rescue SystemCallError
retry
end

Melempar eksepsi

Ruby menyediakan tiga cara pelemparan eksepsi:

raise

raise “bad mp3 encoding”

raise InterfaceException, “Keyboard failure”

raise InterfaceException, “Keyboard failure”, caller

Membuat kelas eksepsi sendiri

Kelas eksepsi harus merupkan turunan dari kelas Exception(atau kelas turunannya)


class RetryException < RuntimeError
attr :okToRetry
def initialize(okToRetry)
@okToRetry = okToRetry
end
end

def readData(socket)
data = socket.read(512)
if data.nil?
raise RetryException.new(true), "transient read error"
end
# .. normal processing
end

Contoh Penggunaan

begin
stuff = readData(socket)
# .. process stuff
rescue RetryException => detail
retry if detail.okToRetry
raise
end

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: