Yanıtlar:
Erken dönerseniz bir fark yaratır:
try:
run_code1()
except TypeError:
run_code2()
return None # The finally block is run before the method returns
finally:
other_code()
Bununla karşılaştır:
try:
run_code1()
except TypeError:
run_code2()
return None
other_code() # This doesn't get run if there's an exception.
Farklılıklara neden olabilecek diğer durumlar:
run_code1()ancak bu bir değil TypeError.continueve breakbildirimler.Kural dışı durumu yakalamasanız bilefinally , bir istisnanın oluşup oluşmadığından bağımsız olarak dosyaların veya kaynakların kapatıldığından veya serbest bırakıldığından emin olmak için kullanabilirsiniz . (Veya bu özel istisnayı yakalamazsanız .)
myfile = open("test.txt", "w")
try:
myfile.write("the Answer is: ")
myfile.write(42) # raises TypeError, which will be propagated to caller
finally:
myfile.close() # will be executed before TypeError is propagated
Bu örnekte, withifadeyi kullanmaktan daha iyi olursunuz , ancak bu tür bir yapı diğer kaynak türleri için kullanılabilir.
Birkaç yıl sonra, okuyucuların eğlenceli bulabileceği bir kötüye kullanım hakkında bir blog yazısı yazdım finally.
Eşdeğer değiller. Sonunda başka ne olursa olsun kod çalıştırılır. Çalıştırılması gereken temizleme kodu için kullanışlıdır.
Finally code is run no matter what else happens... sonsuz bir döngü olmadığı sürece. Veya bir elektrik kesimi. Veya os._exit(). Veya ...
os._exit.
Yukarıdaki diğer yanıtlara eklemek için, finallymadde ne olursa olsun yürütülürken, elseyalnızca bir istisna oluşturulmadığı takdirde yan tümce yürütülür.
Örneğin, istisnasız bir dosyaya yazmak aşağıdakileri çıkarır:
file = open('test.txt', 'w')
try:
file.write("Testing.")
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")
ÇIKTI:
Writing to file.
Write successful.
File closed.
Bir istisna varsa, kod aşağıdakileri çıkarır (kasıtlı bir hatanın dosyanın salt okunur tutulmasından kaynaklandığını unutmayın.
file = open('test.txt', 'r')
try:
file.write("Testing.")
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")
ÇIKTI:
Could not write to file.
File closed.
finallyİstisnadan bağımsız olarak maddenin yürütüldüğünü görebiliriz . Bu yardımcı olur umarım.
elseBir şey olduğunu bilmiyordum . Bilmenizde fayda var.
Kod blokları eşdeğer değildir. finallyEğer fıkra da idare edilecek run_code1()dışındaki bir istisna atar TypeError, ya eğer run_code2()ederken, bir istisna atar other_code()ilk sürümünde bu durumlarda çalışacağı olmaz.
Belgelerde açıklandığı gibi , bu finallymadde her koşulda gerçekleştirilmesi gereken temizleme eylemlerini tanımlamayı amaçlamaktadır .
Varsa
finally, bir 'temizleme' işleyicisi belirtir.tryMaddesi her dahil olmak üzere çalıştırılırexceptveelsemaddeleri. Herhangi bir yan tümcede bir özel durum oluşursa ve işlenmezse, özel durum geçici olarak kaydedilir.finallyBloğu icra edilir. Kaydedilmiş bir istisna varsa, bufinallymaddenin sonunda yeniden yükseltilir .
Bir örnek:
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
Gördüğünüz gibi, finallymadde herhangi bir olayda yürütülür. TypeErrorİki dizeyi bölerek kaldırdı tarafından ele edilmez exceptmaddesi ve sonrasında bu nedenle istisna tekrar finallybloğu icra edilmiştir.
Gerçek dünya uygulamalarında, nihayet cümlesi, kaynak kullanımının başarılı olup olmadığına bakılmaksızın harici kaynakları (dosyalar veya ağ bağlantıları gibi) serbest bırakmak için yararlıdır.
Mükemmel örnek aşağıdaki gibidir:
try:
#x = Hello + 20
x = 10 + 20
except:
print 'I am in except block'
x = 20 + 30
else:
print 'I am in else block'
x += 1
finally:
print 'Finally x = %s' %(x)
finally"temizlik eylemlerini" tanımlamak içindir . finallyFıkra ayrılmadan önce her halükarda yürütülen trybir istisna (Başedebilir dahi) oluştu içerisinde olup olmadığını, açıklama.
Byers örneğini ikinci olarak verdim.
Son olarak, ana işiniz için kodu çalıştırmadan önce "isteğe bağlı" kodu çalıştırmak istediğinizde de kullanılabilir ve isteğe bağlı kod çeşitli nedenlerle başarısız olabilir.
Aşağıdaki örnekte, ne tür istisnaların ortaya store_some_debug_infoçıkabileceğini tam olarak bilmiyoruz .
Koşabiliriz:
try:
store_some_debug_info()
except Exception:
pass
do_something_really_important()
Ancak, çoğu linteri bir istisnadan çok belirsiz yakalamaktan şikayet edecektir. Ayrıca, sadece passhatalar için seçtiğimiz için, exceptblok gerçekten değer katmaz.
try:
store_some_debug_info()
finally:
do_something_really_important()
Yukarıdaki kod, 1. kod bloğu ile aynı etkiye sahiptir, ancak daha özlüdür.
Delphi'yi birkaç yıl boyunca profesyonelce kullanmak, nihayet kullanarak temizlik rutinlerimi korumamı öğretti. Delphi, hemen hemen bir bellek sızıntısına neden olmamak için deneyin bloğundan önce oluşturulan kaynakları temizlemek için nihayet kullanımını zorlar. Java, Python ve Ruby de böyle çalışır.
resource = create_resource
try:
use resource
finally:
resource.cleanup
ve denemek ve nihayetinde ne yaparsanız yapın kaynak temizlenir. Ayrıca, yürütme hiçbir zaman trybloğa ulaşmazsa temizlenmez . (yani create_resourcekendisi bir istisna atar) Kodunuzu "istisna güvenli" yapar.
Neden sonunda nihayet bir bloğa ihtiyaç duyduğunuza gelince, tüm diller değil. İstisna yığının kilidini açtığında temizlemeyi zorunlu kılan yıkıcıları otomatik olarak çağırdığınız C ++ 'da. Bence bu, denemeye kıyasla daha temiz kod yönünde bir adım. Son olarak diller.
{
type object1;
smart_pointer<type> object1(new type());
} // destructors are automagically called here in LIFO order so no finally required.
Bir try bloğunun sadece bir zorunlu maddesi vardır: try ifadesi. Dış, else ve son olarak yan tümceleri isteğe bağlıdır ve kullanıcı tercihine bağlıdır.
son olarak: Python try ifadesinden ayrılmadan önce, programı sonlandırsa bile, herhangi bir koşulda nihayet bloğundaki kodu çalıştırır. Örneğin, Python, dışlama veya başka bir blokta kod çalıştırılırken bir hatayla karşılaşırsa, son durdurma programı durdurmadan önce yine de yürütülür.
Sonunda aşağıdakileri izlemek için bu Python3 kodlarını çalıştırın:
DAVA 1:
count = 0
while True:
count += 1
if count > 3:
break
else:
try:
x = int(input("Enter your lock number here: "))
if x == 586:
print("Your lock has unlocked :)")
break
else:
print("Try again!!")
continue
except:
print("Invalid entry!!")
finally:
print("Your Attempts: {}".format(count))
Durum 2:
count = 0
while True:
count += 1
if count > 3:
break
else:
try:
x = int(input("Enter your lock number here: "))
if x == 586:
print("Your lock has unlocked :)")
break
else:
print("Try again!!")
continue
except:
print("Invalid entry!!")
print("Your Attempts: {}".format(count))
Her seferinde aşağıdaki girişleri deneyin:
** Python öğrenmenin çok erken bir aşamasında.
Ben excel yaprak okumak istedim bir kod çalıştırmak için çalışıyordu. Sorun, adında hiçbir sayfası olan bir dosya varsa: SheetSum Hata konumuna taşıyamıyorum !! Yazdığım kod:
def read_file(data_file):
# data_file = '\rr\ex.xlsx'
sheets = {}
try:
print("Reading file: "+data_file)
sheets['df_1'] = pd.read_excel(open(data_file,'rb'), 'SheetSum')
except Exception as excpt:
print("Exception occurred", exc_info=True)
return sheets
read_file(file)
shutil.move( file, dirpath +'\\processed_files')
Hata Verme:
[WinError 32] Başka bir işlem tarafından kullanıldığından işlem dosyaya erişemiyor
Ben tam try except with finallyblok eklemek ve finallyben gibi herhangi bir durumda dosyayı kapatmanız gerektiğini söylemek zorunda kaldı:
def read_file(data_file):
# data_file = '\rr\ex.xlsx'
sheets = {}
try:
print("Reading file: "+data_file)
sheets_file = open(data_file,'rb')
sheets['df_1'] = pd.read_excel(sheets_file, 'SheetSum')
except Exception as excpt:
print("Exception occurred", exc_info=True)
finally:
sheets_file.close()
return sheets
read_file(file)
shutil.move( file, dirpath +'\\processed_files')
Aksi takdirde, dosya hala açık kalır arka plan.
Varsa
finally, bir temizleme işleyicisi belirtir .tryMaddesi her dahil olmak üzere çalıştırılırexceptveelsemaddeleri. Herhangi bir yan tümcede bir özel durum oluşursa ve işlenmezse, özel durum geçici olarak kaydedilir .finallyBloğu icra edilir. Kaydedilmiş bir istisna varsa, bufinallymaddenin sonunda yeniden yükseltilir . Eğerfinallyfıkra başka özel durum oluşturur, kaydedilen istisna yeni istisna kapsamında olarak ayarlanır.
..Daha Fazla Burada