2010-11-15 17 views
9

Python'da kullanıcı tanımlı istisnalar ve bunların eksiksiz bir projede nasıl düzenlenmesi gerektiği hakkında bazı sorularım var. Ben modülleri bunları kullanmak için kendi İstisna uygulamak istiyoruzPython: Komple bir projede kullanıcı tanımlı istisnaların organizasyonu

/docs (Documentation) 
/apidocs (generated API documentation) 
/askindex (my application package) 
    /test (Unit tests directory) 
     test_utils.py 
     ... (more tests) 
    /workers (various worker classes) 
     communicators.py 
     processes.py 
     threads.py 
     utils.py 
    main.py (contains the starting point) 
    data_objects.py (various objects used all around the application) 
    settings.py (settings of the application) 
README.txt 

:

aşağıdaki yapıyı ( __init__.py atlanmıştır) sahiptir bazı alt paketleri ile oldukça karmaşık piton projesi var belirli hatalar için işçi paketi.

Bu istisnaları nereye yerleştirmeliyim? Standart istisna sınıfının alt sınıflarını ve diğer istisnalarım için alt sınıfı olan kendi temel istisnamı almam gerektiğini biliyorum. 'İşçiler' altında yeni bir 'istisnalar' modülü oluşturmalı mıyım? Özel durum sınıflarını yükseltildikleri modülde mi? Bu durumda, temel dersimi nereye koymalıyım? Başvuru yapmam uygun mu? Cevap açıktır eğer Python içinde istisnalara yeniyim

, bu yüzden istisna özel bir türü istediğinizde, belirli olduğunu ben kendi iş ile buldum ... Genelde

cevap

5

İzninizle belirli bir modül veya paket için. Bir modülle ilgili ise, onu sadece bu modülde yapıyorum. İstisnalar için ayrılmış bir modül ya da pakete sahip olmanın daha iyi olacağı bir durum bulamadım.

Örnekler: Bir DroppedBall (çürük domates ya da benzer atma işaret) yükseltebilir bir yöntem juggle ile içinde bir sınıf Juggler ile, bir jester modülü varsa, DroppedBalljester modülünde olacaktır. Daha sonra crowd.Person örnekleri, jonggler'ı ve except jester.DroppedBall'u izleyerek try olabilir.

I (food.Foodstuff, kuşkusuz miras) bir eat yöntemine sahip tüm vs. İçinde çeşitli modülleri ile bir paket food, fruit, vegetable olsaydı, bunlar doğal olarak ait olan bir RottenException yükseltmek mümkün olabilir food paketinin kökü: __init__.py.

+0

Hızlı cevap için teşekkürler. __init__.py modülünü düşünmemiştim. Paket belgelerini ve metalarını dışında asla neyin içine konacağını gerçekten bilmedim. Örneğinizin ardından, istisna, food.RottenException olarak mı referans alınacak? –

+1

@Marc: yes. Büyük modüller için ortak bir model, onları ayrı modüllere bölmek ve '__init __. Py' paketlerini tekrar bir araya getirmek için göreceli ithalat içermek zorundadır (genellikle xyz import * 'den xyz '__all__' ile tanımlanır). Bu durumda, muhtemelen geçerli değildir. Potansiyel olarak "ithalatçı" 'it os.path' ifadesini ima edecek şekilde, 'it' 'yolu' 'gibi' iletişimciler, süreçler, iş parçacıkları, araçlar 'ithal etmek isteyebilirsiniz. –

+0

@Marc: 'Gıda' örneğinin bir adım ötesinde, 'Gıda Maddesi' sınıfı '__init __. Py' ve 'food.fruit' gıdaları ithal edecek ve daha sonra 'sınıf Domates' olacaktı (food.Foodstuff).) '. Dikkatli olduğunuz ve 'gıda ithalatı Gıda Maddelerinden 'kullanmadığınız sürece, döngüsel referans tamamdır (bakınız [effbot'ta] [http://effbot.org/zone/import-confusion.htm#circular] -imports)). –

İlgili konular