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
.continue
ve break
bildirimler.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, with
ifadeyi 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, finally
madde ne olursa olsun yürütülürken, else
yalnı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.
else
Bir şey olduğunu bilmiyordum . Bilmenizde fayda var.
Kod blokları eşdeğer değildir. finally
Eğ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 finally
madde her koşulda gerçekleştirilmesi gereken temizleme eylemlerini tanımlamayı amaçlamaktadır .
Varsa
finally
, bir 'temizleme' işleyicisi belirtir.try
Maddesi her dahil olmak üzere çalıştırılırexcept
veelse
maddeleri. Herhangi bir yan tümcede bir özel durum oluşursa ve işlenmezse, özel durum geçici olarak kaydedilir.finally
Bloğu icra edilir. Kaydedilmiş bir istisna varsa, bufinally
maddenin 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, finally
madde herhangi bir olayda yürütülür. TypeError
İki dizeyi bölerek kaldırdı tarafından ele edilmez except
maddesi ve sonrasında bu nedenle istisna tekrar finally
bloğ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 . finally
Fıkra ayrılmadan önce her halükarda yürütülen try
bir 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 pass
hatalar için seçtiğimiz için, except
blok 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 try
bloğa ulaşmazsa temizlenmez . (yani create_resource
kendisi 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 finally
blok eklemek ve finally
ben 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 .try
Maddesi her dahil olmak üzere çalıştırılırexcept
veelse
maddeleri. Herhangi bir yan tümcede bir özel durum oluşursa ve işlenmezse, özel durum geçici olarak kaydedilir .finally
Bloğu icra edilir. Kaydedilmiş bir istisna varsa, bufinally
maddenin sonunda yeniden yükseltilir . Eğerfinally
fıkra başka özel durum oluşturur, kaydedilen istisna yeni istisna kapsamında olarak ayarlanır.
..Daha Fazla Burada