Bởi Václav Brožík qua Thảo luận về Python. org lúc 12 tháng 8 năm 2022 21. 54
Cameron SimpsonĐiều này là để có một cơ chế xử lý các ngoại lệ [có nghĩa là
không nâng cấp chúng] từ logic trong câu lệnh cuối cùngNó thực sự là lý do?
Đó là những gì ngữ nghĩa đó làm
Tại sao PEP8 không khuyến khích sử dụng nó nếu nó được thiết kế như vậy?
Có rất nhiều thứ không được khuyến khích. Điều đó chỉ có nghĩa là bạn
nên tránh nó mà không có lý do chính đáng. Nói chung là như vậy mà mã
dễ đọc và có ngữ nghĩa “chung” hoặc “điển hình”. Khi bạn lấy
lộ trình bất thường mà bạn đang làm người đọc ngạc nhiên [hoặc đánh lừa họ nếu
họ nhớ rằng điều này là bất thường]. Nhưng đôi khi đó là những gì được yêu cầu
Tôi không khuyến khích bạn đi theo con đường thông thường mà không có lời giải thích
bình luận
Dù sao, đối với tôi nó có vẻ như là một thiết kế bẩn thỉu nếu một tác dụng phụ như vậy là
cố ý thêm vào các lệnh
Bạn sẽ ủng hộ việc không tăng lại ngoại lệ đang “sống” như thế nào
trong một mệnh đề finally
?
Đây là một câu hỏi bán nghiêm trọng
- bạn muốn một loại
finally
nào đó kích hoạt ngay cả khi mã
bên trongtry
/except
đưa ra một ngoại lệ - bạn có một trường hợp không nên tăng lại ngoại lệ đó
Ưu điểm của việc đưa điều khiển luồng vào finally
ngữ nghĩa là nó tránh sao chép [dễ bị lỗi và dài dòng] của
mã "dọn dẹp" hoặc "kế toán". Đề xuất thay thế của bạn là gì?
Chúc mừng,
Cameron Simpson cs@cskk. nhận dạng. âu
Bởi Václav Brožík qua Thảo luận về Python. org lúc 12 tháng 8 năm 2022 21. 54
Dù sao, đối với tôi nó có vẻ như là một thiết kế bẩn thỉu nếu một tác dụng phụ như vậy là
cố ý thêm vào các lệnhBạn sẽ ủng hộ việc không tăng lại ngoại lệ đang “sống” như thế nào
trong một mệnh đềfinally
?
Đây là một câu hỏi bán nghiêm trọng
- bạn muốn một loại
finally
nào đó kích hoạt ngay cả khi mã
bên trongtry
/except
đưa ra một ngoại lệ- bạn có một trường hợp không nên tăng lại ngoại lệ đó
Chỉ muốn thêm vào điều này. Theo một số cách, mệnh đề except
có nghịch đảo
ngữ nghĩa đối với mệnh đề finally
bởi vì trong một except
, “live”
ngoại lệ không được gọi lại trừ khi chúng tôi gọi
>>> for i in 1, 2, 3:
.. print[i]
.. try:
.. raise ValueError
.. finally:
.. print["finally 1"]
.. break
.. print["finally 2"]
...
1
finally 1
>>>
7Do đó, bạn có thể ủng hộ điều đó trong finally
, thay vì dựa vào
>>> for i in 1, 2, 3:
.. print[i]
.. try:
.. raise ValueError
.. finally:
.. print["finally 1"]
.. break
.. print["finally 2"]
...
1
finally 1
>>>
9 hoặc try:
something
except ValueError as e:
if not funky_ok_value_error[e]:
raise
finally:
print["something, or something not"]
0, v.v. để ngăn chặn việc tăng lại, một cách tiếp cận rõ ràng hơncó thể là một dạng đặc biệt của câu lệnh
>>> for i in 1, 2, 3:
.. print[i]
.. try:
.. raise ValueError
.. finally:
.. print["finally 1"]
.. break
.. print["finally 2"]
...
1
finally 1
>>>
7, ví dụ như try:
something
except ValueError as e:
if not funky_ok_value_error[e]:
raise
finally:
print["something, or something not"]
2, màngữ nghĩa có thể là thực hiện một số kiểu “tăng giả” thoát khỏi
Điều khoản
finally
nhưng sau đó tiếp tục thực hiện bên dướitry:
something
except ValueError as e:
if not funky_ok_value_error[e]:
raise
finally:
print["something, or something not"]
4ngoại trừtry:
something
except ValueError as e:
if not funky_ok_value_error[e]:
raise
finally:
print["something, or something not"]
5cuối cùng`Đối với tôi, cảm giác đó giống như những gì
>>> for i in 1, 2, 3:
.. print[i]
.. try:
.. raise ValueError
.. finally:
.. print["finally 1"]
.. break
.. print["finally 2"]
...
1
finally 1
>>>
9 làm trong một vòng lặp. Tôi ủng hộ điều đó choluồng "chặn ngoại lệ"
Nhưng nó đã được thực hiện
________số 8_______Làm rõ ví dụ
>>> for i in 1, 2, 3:
.. print[i]
.. try:
.. raise ValueError
.. finally:
.. print["finally 1"]
.. break
.. print["finally 2"]
...
1
finally 1
>>>
Vì vậy, chúng tôi không thể sử dụng
>>> for i in 1, 2, 3:
.. print[i]
.. try:
.. raise ValueError
.. finally:
.. print["finally 1"]
.. break
.. print["finally 2"]
...
1
finally 1
>>>
9, vì điều đó có thể phá vỡ mã hiện cóTôi cho rằng sự kết hợp này với các hiệu ứng trên vòng lặp for bên ngoài
luồng điều khiển là điều khiến bạn khó chịu về ngữ nghĩa không tăng của finally
?
Suy nghĩ?
Chúc mừng,
Cameron Simpson cs@cskk. nhận dạng. âu
Bởi Cameron Simpson qua Thảo luận về Python. org lúc 12 tháng 8 năm 2022 22. 59
Vì vậy, chúng tôi không thể sử dụng
9, vì điều đó có thể phá vỡ mã hiện có>>> for i in 1, 2, 3: .. print[i] .. try: .. raise ValueError .. finally: .. print["finally 1"] .. break .. print["finally 2"] ... 1 finally 1 >>>
Tôi cho rằng sự kết hợp này với các hiệu ứng trên vòng lặp for bên ngoài
luồng điều khiển là điều khiến bạn khó chịu về ngữ nghĩa không tăng củafinally
?
Tôi đang đọc lại các tài liệu ở đây
đặc biệt là đoạn bắt đầu “Nếu cuối cùng là hiện tại…”
Theo một số cách, tôi nghĩ rằng chúng ta có 2 điều đang diễn ra ở đây
- làm rõ điều gì sẽ xảy ra nếu lập trình viên đặt
9 hoặc>>> for i in 1, 2, 3: .. print[i] .. try: .. raise ValueError .. finally: .. print["finally 1"] .. break .. print["finally 2"] ... 1 finally 1 >>>
0try: something except ValueError as e: if not funky_ok_value_error[e]: raise finally: print["something, or something not"]
hoặcfinally
3 trong mệnh đềfinally
- mô tả một cách để không reraise từ
finally
nếu có một hiện tại
ngoại lệ
Đối với trước đây, tôi nghĩ ngữ nghĩa hiện tại là hoàn toàn ổn. nếu
chương trình đặt một trong những câu lệnh luồng điều khiển đó vào một finally
điều khoản, nó không phải là vô lý để tôn vinh nó. Lập trình viên biết điều đó
họ đang ở trong một mệnh đề finally
Về phần sau, tôi gần như nghĩ rằng chúng ta đang lạm dụng những ngữ nghĩa này như là
cơ chế không tăng giá. Bởi vì trong mắt tôi, đó là cơ chế duy nhất
trong mệnh đề finally
cho điều đó
Tôi đang đọc lại để xem văn bản có gợi ý rằng ngữ nghĩa
là để không nâng cấp lại, hoặc hoàn toàn để chỉ định những gì
>>> for i in 1, 2, 3:
.. print[i]
.. try:
.. raise ValueError
.. finally:
.. print["finally 1"]
.. break
.. print["finally 2"]
...
1
finally 1
>>>
9/_______2_______0/finally
3 trong mệnh đề finally
có nghĩa là. bây giờ tôi nghĩ rằngsau này
Vì thế. chúng ta nên làm gì để không tăng lại một ngoại lệ trong cuối cùng
khoản?
Tôi nghĩ rằng cách tiếp cận "cuối cùng" là ngược lại;
cách tiếp cận sạch ở đây. Coi như. vắng mặt một trong những câu lệnh kiểm soát đó, một
Điều khoản finally
luôn tăng lại. Trừ khi có một except
để
xử lý ngoại lệ
Vì vậy, có lẽ cách rõ ràng để “không tăng lại” là xác định các trường hợp ngoại lệ
mà không nên chỉ nâng cao lại trong except
s
try:
something
except ValueError as e:
if not funky_ok_value_error[e]:
raise
finally:
print["something, or something not"]
Ở đây chúng tôi quyết định liệu ngoại lệ finally
6 có nên tăng lại trongexcept
, và không có trong finally
Trên thực tế, các tài liệu nói rằng mệnh đề finally
không có quyền truy cập vào
ngoại lệ hiện tại [nếu có], điều này cũng gợi ý rằng mệnh đề finally
là một nơi tồi tệ để đưa ra những quyết định này. Tất cả các quyết định đó thuộc về
trước mệnh đề except
Có ai có ví dụ ngược lại trong đó mệnh đề finally
là mệnh đề duy nhất không
nơi để quyết định một cách hợp lý về việc tăng lương?
Chúc mừng,
Cameron Simpson cs@cskk. nhận dạng. âu