2012-02-28 11 views
11

Ben scalatra kullanıyorum etmek Json için "ihracat" Bir MongoDB veri, hareketlerim gibi çok basit: bir şey, diğer tarafta ters giderse HTTP hatası ve bir metin göndermek istediğinizHerhangi bir scalatra eylemindeki tüm hataları nasıl yakalarsınız?

get("/") { 
     val title = db.get_collection("main", "api", "title") 
     send_json(title) 
    } 

kullanıcı için anlamlı bir şeye dönüştürülecektir.

get("/") { 
    try { 
     val title = db.get_collection("main", "api", "title") 
     send_json(title) 
    } catch { 
     case e:java.util.NoSuchElementException => send_error("DB malformed", InternalError) 
     case e:com.mongodb.MongoException => send_error("Can not connect to MongoDB", InternalError) 
     case e => send_error("Internal Error", InternalError) 
    } 
    } 

try catch gerçek usulde olduğu büyüktür ve her yöntemle, ilk bakışta deneyin catch çirkin bir koleksiyon haline sınıf için bunu yapmak gerekir: Yani yöntem becames. Kötü görünen ve dikkat dağıtıcı kodları engellemek veya en aza indirmek için herhangi bir yol var mı? Ben Scala (ve Java BTW) için yeniyim, bu yüzden bir şeyleri kaçırdığımı düşünüyorum.

DB nesnesinin JSON göndermesini istemiyorum, bu nedenle db.get_collection yönteminde try catch'u kullanmak bir seçenek değil.

cevap

5

Eh, yeterince Scalatra bilmiyorum ama catch blok kısmi fonksiyon, yani böyle bir şey yapabileceğini:

val errorHandling: PartialFunction[Throwable, Unit] = { 
    case e:java.util.NoSuchElementException => send_error("DB malformed", InternalError) 
    case e:com.mongodb.MongoException => send_error("Can not connect to MongoDB", InternalError) 
    case e => send_error("Internal Error", InternalError) 
} 

get("/") { 
    try { 
    val title = db.get_collection("main", "api", "title") 
    send_json(title) 
    } catch errorHandling 
} 
+0

benim son çözüm oldu: 'val ErrorHandling: PartialFunction [Atılabil, Birim] = {' Ben errorHandler kullanırsanız , elimde etkisiz olması gerekiyor için bu adla ilgili bir hata var. Aynı zamanda java.lang'a ihtiyaç duyuluyordu. İstisna yerine Except – user1216071

+0

@ user1216071 Tamam, kodu buna göre düzelttim, bu yüzden başkalarının bunu anlaması gerekmeyecek (eğer yorumunuzu kaçırırlarsa). –

37

özel rota işleyicisi bunun için vardır:

error { 
    case e: Throwable => { 
    redirect("/") 
    } 
} 

case deyimini değiştirerek hata türünü değiştirebilirsiniz.

+0

Bu, Scalatra'daki hataların ele alınması için kullanılan, deyimden eksik olan bir yöntemdir. – afternoon

+3

Bu kabul edilen cevap olmalı. –

İlgili konular