2009-03-06 21 views
1

Python ve wxPython'da yazılmış karmaşık bir GUI uygulamasına sahibim.wxPython'un 'İşlenmeyen özel durum' iletişimini göstermesini engelle iletişim kutusu

Windows Vista için sertifikalı olmasını istiyorum, dolayısıyla Windows Hata Bildirimi iletişim kutusuna ("" Microsoft'a rapor göndermek istiyor musunuz? ") görüntülenecek şekilde çökmesi gerekiyor. Bu, "Windows Vista Test Kılıfları için Sertifikalı" belgesinden 32 numaralı vakayı test etmekle ilgilidir. Ben ThreadHijacker aracıyla Uygulamamı kazasında zaman

Maalesef wxPython mesajı gibi gösterilmektedir:

Unhandled exception 
--------------------------- 
An unhandled exception occurred. Press "Abort" to terminate the program, 
"Retry" to exit the program normally and "Ignore" to try to continue. 
--------------------------- 
Abort Retry Ignore

nasıl bu mesajı göstermesini wxPython önleyebilir ? Özel sys.excepthook var, ancak bu iletişim kutusunun benim özel kanca müdahalesi olmadan önce göründüğü görünüyor.

DÜZENLEME:

WxWidgets docswxAppConsole :: OnExceptionInMainLoop denir söylüyor ve MSW altında kullanıcının farklı seçenekler arasında seçim yapmanızı sağlar bazı fantezi iletişim kutusunu görüntüler. Ancak, wxPython bu işlevi aşırı yüklemeye izin vermez. WxPython'da wxAppConsole :: OnExceptionInMainLoop'un varsayılan davranışını nasıl değiştireceğini bilen var mı?
Ben C gitmek olanlar üzerinde Python düzeyinde çözümleri tercih/C++

EDIT2:

Sonuçta, ben wxPython posta listesine istedi ve Robin Dunn o bakacağız yanıtını wxPython'un bir sonraki sürümlerinde wxAppConsole :: OnExceptionInMainLoop'u geçersiz kılmak. Bekleyemediğimden bu fonksiyonu içermeyen wxPython'un kendi versiyonunu derlemeliydim. Derleme işaretlerinin düzgün bir şekilde ayarlanmasıyla wxAppConsole :: OnExceptionInMainLoop işlevinin etkinleştirilip devre dışı bırakılabileceği ortaya çıktı.

+0

Burada bir cevap alamıyorsanız, en iyi bahis muhtemelen bir çok uzman (Robin Dunn dahil) orada takıldığından wxpython posta listesini denemektir. –

cevap

2

Hepsi değişti sadece bir derleme bayrağıyla, WxWidgets ve wxPython kendi derleme ile sona erdi: 0. Robin Dunn o wxPython yama çalışacağını yazdı

ayarlanmalıdır wxUSE_EXCEPTIONS, bu nedenle bu davranış tüm kütüphane yeniden derlenmeden değiştirilebilir.

1

, bu WxWidgets üst düzey (wxApp) bir catch (...) 'dir deneyin. Yapılandırılmış Özel Durumda bir ilk çekim almak için vektörlü bir Özel Durum İşleyici veya _set_se_translator() kullanabilir ve buradan WER, yani ReportFault() öğesine çıkabilirsiniz.

+0

wxWidgets ve ReportFault() hakkında haklısınız, bu bana doğru yönde işaret etti. Ancak wxPython'da varsayılan davranışı değiştiremiyorum (Python'a aktarılmadı gibi görünüyor). – Abgan

+0

Sorunuzu güncellemek isteyebilirseniz,% 100 bir python çözümü istiyorsunuz. Önerdiğim her iki çözüm de ya temel CRT'de ya da Win32 seviyesinde yerel kod yazıyor. – MSalters

1

Her şeyi halledebilmeniz mümkün mü? Bir denemelisiniz: sanırım: bir widget'a bağlı her yöntemin etrafını bloke edin. (Ben wxPython alıcı kendi yapar orası tahmin beri)

def catch_exception(f): 
    def safe(*args, **kw): 
     try: 
      f(*args, **kw) 
     except Exception, e: 
      handle_exception(e) 
    return safe 

def handle_exception(e): 
    # do Vista stuff 
    sys.exit() 

Sonra mainloop tarafından adlandırılabilir herhangi bir işlev süslemek: Sen bir dekoratör yazabilirsin.

+0

Kodumda> 80k satırlık kod var, bu çok fazla zaman alacaktı ... Korkarım ki bu hata C++ kodunda ortaya çıkıyor ve C++ seviyesinde tamamen kullanılıyor. Gerçekten yapmak istediğim bu hatayı işlemek içindir * ÖNCE * wxWidgets bunu yapar. – Abgan

+0

Neyse - Metodu geçmediği için yönteminizi kontrol edeceğim. Teşekkürler ve sizin için çok teşekkür ederim. :-) – Abgan

İlgili konular