2012-12-19 13 views
10

Bir Pyramid web uygulamasında bir tür "yakalama" hatası işleyebilmemin bir yolu var mı? Şu anda bir veritabanına (http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.html adresindeki dokümanlar aracılığıyla) günlüğe kaydetme istisnası uyguladım ve ne olduğuyla ilgili bir "güler yüzlü" yüz ifadesi koymak için mesajlarımı görünümlerime geri göndereceğim.Piramit ele geçirme dostu istisna işleme

Ama bir çeşit genel "Oops, bir sorunla karşılaştınız ve buna bakıyoruz" diyebileceğimiz bir şey var, açıkça yakalamadığım başka bir şey için, ve yukarıdakileri kullanabilirim veritabanına ne olursa olsun oturum açmak için sahne arkasında hata işleyici? Ya da, aramalarda ne tür bir şey aramalıyım?

sayesinde, Bir yoruma hepsini sığamaz beri

düzenleme: . Teşekkürler, bu tam olarak aradığım şey gibi görünüyor! o ilgili ya değilse ben içine çalıştırıyorum

Bir şey, ben

Yani şöyle yukarıdaki gibi SQL logger uygulayan ediyorum .... bilmiyorum:

class SQLAlchemyHandler(logging.Handler): 
    # A very basic logger that commits a LogRecord to the SQL Db 
    def emit(self, record): 
     trace = None 
     exc = record.__dict__['exc_info'] 
     if exc: 
      trace = traceback.format_exc(exc) 
     log = Log(
      logger=record.__dict__['name'], 
      level=record.__dict__['levelname'], 
      trace=trace, 
      msg=record.__dict__['msg'],) 
     DBSession.add(log) 
     DBSession.flush() 
     #transaction.commit() 

'Transaction.commit()' çağrısını çıkarmalı ve yerine .flush() kullanmalıyım çünkü işlem kullanırken SQLAlchemy DetachedInstanceError istisnası alıyordum. Sanırım bunun sebebi, bir oyun işlevine bir istekte bulunarak bazı oyunlar oynuyorum ve fırlattığı yer orası. Yani oturumu kızartarak çalışır. Buuuut, ne olur benim istisna görünümünde bir log.error() deyimi varsa, bir istisna aslında atılır (büyük!) Görünümünde yakalar, ancak görünümde günlük deyimi işlenmezse, neutuut olur. Piramit'teki hata ayıklama günlükleri yazıldığını, ancak hiçbir zaman taahhüt edilmediğini gösterir.

Günlüğe kaydetme işleyicisini transaction.commit olarak değiştirirseniz, istisnalarını taahhüt ederim ancak orijinal sorunuma geri döndüm. Sanırım ilk etapta ona neden olan yardımcı fonksiyonumda yaptığım şeye odaklanmam gerekiyor, ama yine de genel olarak SQLAlchemy öğreniyorum. Bazen biraz garip olabilir.

cevap

10

Bir exception view kurabilirsiniz. Örneğin,

@view_config(context=Exception) 
def error_view(exc, request): 
    #log or do other stuff to exc... 
    return Response("Sorry there was an error") 
+0

Çok güzel! Ve bu, _anywhere_ görünümünde görülebilen _any_ istisnasını ele alabilir, doğru mu? Bir Cevabı döndürmek yerine, teknik olarak sadece 'att' atabilir miyim? Bu yaklaşım bugün hala tavsiye ediliyor mu? – Jens

İlgili konular