Tôi bắt gặp một hành vi kỳ lạ ở Python. Tôi không thể tìm thấy thông tin về điều này trong Trợ giúp Python hoặc trên SE vì vậy đây là:
def divide[x, y]:
print 'entering divide'
try:
return x/y
except:
print 'error'
else:
print 'no error'
finally:
print 'exit'
print divide[1, 1]
print divide[1, 0]
đầu ra:
entering divide
exit
1
entering divide
error
exit
None
Có vẻ như Python sẽ không đi vào trong khối else
nếu một giá trị được trả về trong try
. Tuy nhiên, nó sẽ luôn luôn đi trong khối finally
. Tôi không thực sự hiểu tại sao. Ai đó có thể giúp tôi với logic này không?
cảm ơn
hỏi ngày 16 tháng 9 năm 2011 lúc 8:40Sep 16, 2011 at 8:40
Simon Bergotsimon BergotSimon Bergot
10K7 Huy hiệu vàng37 Huy hiệu bạc55 Huy hiệu Đồng7 gold badges37 silver badges55 bronze badges
Lý do cho hành vi này là do return
bên trong try
.
Khi một ngoại lệ xảy ra, cả finally
và
entering divide
exit
1
entering divide
error
exit
None
1 đều chặn thực thi trước return
. Mặt khác, chỉ finally
thực thi và else
không vì chức năng đã được trả lại.Điều này hoạt động như mong đợi:
def divide[x, y]:
print 'entering divide'
result = 0
try:
result = x/y
except:
print 'error'
else:
print 'no error'
finally:
print 'exit'
return result
print divide[1, 1]
print divide[1, 0]
Đã trả lời ngày 16 tháng 9 năm 2011 lúc 8:49Sep 16, 2011 at 8:49
SaulsaulSaul
17.8K8 Huy hiệu vàng61 Huy hiệu bạc87 Huy hiệu đồng8 gold badges61 silver badges87 bronze badges
Khối else
không được thực thi vì bạn đã rời khỏi chức năng trước khi nó có cơ hội để làm điều đó.
Tuy nhiên, khối finally
luôn được thực thi [trừ khi bạn kéo dây nguồn hoặc một cái gì đó tương tự].
Hãy xem xét điều này [như một thử nghiệm suy nghĩ; xin đừng làm điều đó trong mã thực]:
def whoops[]:
try:
return True
finally:
return False
Xem những gì nó trở lại:
>>> whoops[]
False
Nếu bạn thấy khó hiểu này, bạn không đơn độc. Một số ngôn ngữ như C# chủ động ngăn bạn đặt câu lệnh return
trong mệnh đề finally
.
Đã trả lời ngày 16 tháng 9 năm 2011 lúc 8:51Sep 16, 2011 at 8:51
Tim Pietzckertim PietzckerTim Pietzcker
Phù bằng vàng 319K5757 gold badges494 silver badges550 bronze badges
3
Tại sao mệnh đề else
không chạy?
Một mệnh đề
else
rất hữu ích cho mã phải được thực thi nếu mệnh đề thử không tăng ngoại lệ.if the try clause does not raise an exception.
Khi bạn gọi
1, mệnh đềdef divide[x, y]: print 'entering divide' result = 0 try: result = x/y except: print 'error' else: print 'no error' finally: print 'exit' return result print divide[1, 1] print divide[1, 0]
try
của bạn sẽ tăng một ngoại lệ
3, do đó mệnh đềdef divide[x, y]: print 'entering divide' result = 0 try: result = x/y except: print 'error' else: print 'no error' finally: print 'exit' return result print divide[1, 1] print divide[1, 0]
else
không chạy.does raise an exception
3, so thedef divide[x, y]: print 'entering divide' result = 0 try: result = x/y except: print 'error' else: print 'no error' finally: print 'exit' return result print divide[1, 1] print divide[1, 0]
else
clause does not run.Khi bạn gọi
5, mệnh đềdef divide[x, y]: print 'entering divide' result = 0 try: result = x/y except: print 'error' else: print 'no error' finally: print 'exit' return result print divide[1, 1] print divide[1, 0]
try
chạy thành công và trả về. Vì vậy, mệnh đềelse
không bao giờ đạt được.and returns. So theelse
clause is never reached.
Tại sao mệnh đề finally
luôn chạy?
Điều khoản
finally
luôn được thực thi trước khi rời khỏi câu lệnh thử, cho dù ngoại lệ có xảy ra hay không.always executed before leaving the try statement, whether an exception has occurred or not.
Xem ở trên.
Tham khảo //docs.python.org/3.5/tutorial/errors.html
Đã trả lời ngày 13 tháng 3 năm 2017 lúc 20:54Mar 13, 2017 at 20:54
kgf3JfUtWkgf3JfUtWkgf3JfUtW
12.4K8 Huy hiệu vàng50 Huy hiệu bạc74 Huy hiệu đồng8 gold badges50 silver badges74 bronze badges
"Return" kết thúc chức năng và trả về bất cứ điều gì bạn muốn nó trở lại. Vì vậy, nó sẽ không tiếp tục. "Cuối cùng" luôn được thực hiện.
Đã trả lời ngày 16 tháng 9 năm 2011 lúc 8:48Sep 16, 2011 at 8:48
MusaabmusaabMusaab
1.5263 huy hiệu vàng18 Huy hiệu bạc37 Huy hiệu đồng3 gold badges18 silver badges37 bronze badges