Hướng dẫn what does except return in python? - ngoại trừ trả về trong python thì sao?

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

Hướng dẫn what does except return in python? - ngoại trừ trả về trong python thì sao?

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

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

Hướng dẫn what does except return in python? - ngoại trừ trả về trong python thì sao?

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

    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)
    
    1, mệnh đề try của bạn sẽ tăng một ngoại lệ
    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)
    
    3, do đó mệnh đề else không chạy.does raise an exception
    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)
    
    3, so the else clause does not run.

  • Khi bạn gọ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)
    
    5, mệnh đề 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 the else 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 https://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

Hướng dẫn what does except return in python? - ngoại trừ trả về trong python thì sao?

MusaabmusaabMusaab

1.5263 huy hiệu vàng18 Huy hiệu bạc37 Huy hiệu đồng3 gold badges18 silver badges37 bronze badges

Chúng ta có thể trở lại ngoại trừ trong Python không?

Hành vi trả lại với thử/ngoại trừ trong mã người dùng Python có thể tăng các ngoại lệ tích hợp.Python xác định thử/ngoại trừ để xử lý các ngoại lệ và tiến hành thực hiện chương trình tiếp theo mà không bị gián đoạn.User code can raise built-in exceptions. Python defines try/except to handle exceptions and proceed with the further execution of program without interruption.

Điều gì ngoại trừ trong Python?

Ngoại trừ được sử dụng để bắt và xử lý (các) ngoại lệ gặp phải trong mệnh đề thử.khác cho phép bạn các phần mã chỉ nên chạy khi không gặp phải ngoại lệ nào trong mệnh đề thử.catch and handle the exception(s) that are encountered in the try clause. else lets you code sections that should run only when no exceptions are encountered in the try clause.

Tuyên bố ngoại trừ làm gì?

Ngoại trừ tuyên bố bắt được một ngoại lệ.Nó được sử dụng để kiểm tra mã cho một lỗi được viết trong câu lệnh thử.Nếu gặp phải lỗi, nội dung của khối ngoại trừ có thể chạy.catches an exception. It is used to test code for an error which is written in the “try” statement. If an error is encountered, the contents of the “except” block are run.

Chúng ta có thể trả lại giá trị từ ngoại trừ khối trong Python không?

Phù hợp với báo giá ở trên, khối cuối cùng thực thi và câu lệnh trả về trong đó chấm dứt thực thi chức năng vui nhộn, ngăn chặn câu lệnh trả về trong khối ngoại trừ hoàn thành thực thi.prevents the return statement within the except block from completing execution.