Konuyu görüntüle
IUCODERS FORUM > Programlama > JAVA > Exception zorunluluğu?
Yazar
crossfire


avatar
izmir
Kayıt: 20.07.2008
25.07.2008-12:04 #49734
Metodlarda Exception kullanma zorunluluğu hakkında bilgi verebilir misiniz? Exception'ların kendi yazacağımız bir hata denetim mekanizmasına göre avantajları nelerdir? Bildiğim kadarıyla bir Exception throw edildiğinde metod sonlanıyor. Bu durumda metoddan dönmesi beklenen değer ne olur? Hata durumunda hem default bir değer döndürmek, hem de bir Exception fırlatmak istersem nasıl bir yol izlemeliyim?
Teşekkürler.





robotum, robotsun, robot
Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
25.07.2008-12:17 #49735
Exception lar her konuda işine yarar.
try{

Bu blogda hata vermesi olası kodlar yazılır. Örnek olarak veritabanı bağlantı cümlecikleri yada hata gönderen (throw ex) fonksyonlar. Bu hataların içesinde hata ile ilgili veriler vardır. bu hata satırı , sebebi yada siz yazdıysanız hatayı içine yazdığınız bir string dir.


}catch(exception ex){

ex.stacktarce (böyleydi sanırım).
bu string size hata sebebini verir. ekrana yazdırarak hata sebebini öğrenebilirsiniz.

}finally{

bu blog son olarak çalışır. hata yakalansana yakalanmasada çalışması garantidir.

}

try{
int a = 1;
int b = 4;

}

burada 1 0 a bölünemeyeceği için hata verir. hata yakalanır ve b ye atama yapılmadan catch bloguna gider.





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
25.07.2008-12:18 #49736
Eğer tüm hatalar fonsyonların dönüş değerleriyle yönetmeye çalışırsan olaylar çok karışıyo.özellikle vertabanı üzerinde çalışıyorsan her veritabanı ile ilgili her satırı bir try catch bloğu içine almak zorunda sayılırsın.peace





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
25.07.2008-12:26 #49737
uygulaman cok sayıda geliştirici arasında paylaşılıyorsa yada api gibi birşey yazmış isen geliştiriciyi yada kullanıcı bilgilendirmek için exception kullanabilirsin.
Örneğin yazmış olduğun bir class parametre olarak int yada string tipinde değişken aldığını varsayalım. aynı isme sahip iki fonksiyon olmayacağı için parametreni Object olarak fonksiyon vermen lazim. Bu durumda metodunu korumak için bu iki tip dışında bir tip gelmiş ise exception fırlatabilirsin.
Aşağı yukarı şöyle birşey olmalı.
.
.
.
public void setParameter(Object o){
if( (o instanceof Integer) || (o instanceof String){
//set params
}else{
 throw new InvalidParameterException("geçersiz parametre");
}
}
.
.
.

class InvalidParameterException extends Exception
{
String message;
 public InvalidParameterException(String msg)
  {
    super(); 
message=msg;
  }
public String getMessage(){
return message;
}
}

illada bir değer döndürmen gerekiyor ise finally kullan.





N/A
Yazar
crossfire


avatar
izmir
Kayıt: 20.07.2008
25.07.2008-13:20 #49751
EDIT:

Bir de şu var; hemen hemen her metodda hata oluşması muhtemel satırlar var. Her metodda throw kullanırsam, hepsini de try-catch bloğu ile kullanmak gerekecek. Bu profesyonel kodlamalarda sık rastlanan bir olay mıdır bilemiyorum.





robotum, robotsun, robot
Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
25.07.2008-13:25 #49752
crossfire yazdi
 
Exception'un nasıl kullanıldığı hakkında yeterince bilgi sahibiyim ama yine de teşekkür ederim. Benim asıl istediğim; bazen hatanın önemi çok büyük (ölümcül) olmuyor, fonksiyonun devam etmesi (örneğin default bir değer döndürmesi) istenebilir. Fakat yine de orada bir hata oluştuğunu bir şekilde öğrenmek isterim. Exception kullanımı daha profesyonelce oluyor ama bu tip durumlarda Exception'dan nasıl faydalanabileceğimi çözemedim. Bir de şu var; hemen hemen her metodda hata oluşması muhtemel satırlar var. Her metodda throw kullanırsam, hepsini de try-catch bloğu ile kullanmak gerekecek. Bu profesyonel kodlamalarda sık rastlanan bir olay mıdır bilemiyorum.


c++ da exception bir class üzerinden oluşturuluyor ve içirisine istenilen her türlü veri eklenebiliyor. c# ve java dada bu tarz şeyler olmalı.





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
neurorebel


avatar

Kayıt: 15.08.2007
25.07.2008-15:20 #49767
exceptionların kullanılmasının iyi ve kötü olduğu durumlar vardır. exception handle etmek pahalı bir işlemdir ve "stack unwinding" (lokal hafızada o ana kadar oluşturulmuş tüm nesnelerin, değişkenlerin yok edilmesi) denen olayı karşılayabileceğiniz durumlarda kullanılmalıdır. yani programınızın herhangi bir noktasında bir hata kontrolü sırasında kendinize şunları sormalısınız

burada hangi hatalar oluşabilir ?

bu hatalar olası hatalar mıdır ? (bir dökümanda aradığınız bir kelimenin bulunmaması, kullanıcının istediğiniz aralıkta bir sayı girmemesi) [gerek yok, hatta kullanılmamalı]

yoksa bu hatalar kritik hatalar mıdır? (okumak istediğiniz dökümanın sistemde bulunmaması, kullanıcıdan sayı istemenize rağmen kullanıcının rakam dışında girdiler vermesi)
[yoruma açık :) ]

bu kod bloğu performans açısından önemli bir blok mu ? (örneğin çok yoğun hesaplama yapan bir döngü) [exception kullanmadan hata olsa da olmasa da güvenli bir şekilde bu operasyon sonlanabilir mi ?]

bütün bunlara rağmen yoruma açıktır ama yukarıdaki temel ölçülere uyulması gerekir. yani sonuç olarak her hata durumunda exception kullanılmaz :)

ek notlar:
*yok edicilerden exception fırlatmayın.
*exception nesnelerinizin içerisinde exception fırlatabilecek işlemler yapmayın.
*exception nesnelerinizi mümkünse evrensel olarak kabul görmüş standart exception sınıflarından türetin. (Örn. C++ std::exception)






Do weird and difficult things.

Yazar
iemre


avatar
Anadolu
Kayıt: 26.05.2007
25.07.2008-15:28 #49768
try
{
}
catch()
{
}
finally
{
// bu kısma istediğin şeyi yazabilirsin ex fırlatsa bile program bu kısmı her halükarda işleyecektir.
}







More than one
Yazar
neurorebel


avatar

Kayıt: 15.08.2007
25.07.2008-15:42 #49771
tabi bir şeyi hatırlatmakta fayda var; eğer catch ile örneğin sadece ArgumentException türünde bir exception handle eyledin :P ve kod farklı bir türde exception fırlattı bu durumda finally bloğundan bir değer döndürmenin bir anlamı yok programın finally bloğunu çalıştırıp intihar edecek maalesef... bu durumda yangında ilk kurtarılması gereken şeyleri kurtarmalısın. mesela henüz kaydedilmemiş dosyaları kaydedebilirsin ya da hata ile ilgili log yazabilirsin. exceptionlar çok ince bir konu olduğu için iyi bir araştırma yapman daha iyi olur :)





Do weird and difficult things.

Yazar
omergok


avatar
kenderuntanbul
Kayıt: 21.02.2007
25.07.2008-16:07 #49776
crossfire yazdi
 
Exception'un nasıl kullanıldığı hakkında yeterince bilgi sahibiyim ama yine de teşekkür ederim. Benim asıl istediğim; bazen hatanın önemi çok büyük (ölümcül) olmuyor, fonksiyonun devam etmesi (örneğin default bir değer döndürmesi) istenebilir. Fakat yine de orada bir hata oluştuğunu bir şekilde öğrenmek isterim. Exception kullanımı daha profesyonelce oluyor ama bu tip durumlarda Exception'dan nasıl faydalanabileceğimi çözemedim. Bir de şu var; hemen hemen her metodda hata oluşması muhtemel satırlar var. Her metodda throw kullanırsam, hepsini de try-catch bloğu ile kullanmak gerekecek. Bu profesyonel kodlamalarda sık rastlanan bir olay mıdır bilemiyorum.


Hata oluşsa bile fonksiyonun devamlılığını sağlamak senin elinde. Yazacağın kodun try kısmında da bir geri dönüş değeri catch kısmında da bir geri dönüş değeri olursa, ondan sonraki adımları ordan gelen dönüş değerine göre devam ettirirsin.
public int cagrilanMethod(int param)
{
try
{

//hede hödö kod kısmı
return 1;
}
catch(Exception e)
{
return 0;
}
}



Sonraki fonksiyonların sana gelecek olan dönüş değerine bağımlılığı yine senin elinde. if(cagrilanMethod(parametresi)==0) şeklinde bir kullanım bağımlılığa sebep olur. Hatanın oluştuğunu görmek istiyorsan illaki en basit çözüm log kullanımıdır.

Çok basit bir örnek vereyim istersen. Bir blog sitesi hazırladığını düşün. Sağ tarafta kategoriler kısmı var diyelim. Sen bu kategorileri listelemek için bir method yazdın.

public static void KategorileriGetir()
{
try
{
//kategorileri veritabanından al ve listele
}
catch(Exception e)
{
logger.error(e);
}
}


şeklindeki bir kod ile eğer bir exception oluşursa sayfanın sağ tarafındaki kategoriler kısmı görünmeyecektir. Fakat sayfanın yüklenmesine devam edilecek, örneğin bir sonraki method olan bağlantılar kısmını oluşturacak olan method çalıştırılacaktır. Ekrana hiçbir hata göstermeden düzeni bozmadan sayfa çalışacak, aynı zamanda oluşan hata kayıt altına alınmış olacaktır. Bu exceptionların türleri de hata ayıklamada işini kolaylaştıracaktır. Kullanıcıyı bilgilendirme açısından da daha anlaşılır hata mesajları verilir. Ekranda sadece "Bir hata oluştu lütfen sistem yöneticisine bildirin" demesinden daha iyidir bence ekranda "Veritabanı bağlantı hatası" yazısını görmek.







Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb