2016-10-21 14 views
6

Vì vậy, tôi đã học python một thời gian và chức năng nâng cao và khẳng định là (những gì tôi nhận ra là cả hai đều sụp đổ ứng dụng, không giống như try - except) thực sự tương tự và tôi không thể thấy một tình huống mà bạn sẽ sử dụng Raise hoặc Assert trên Try.Sự khác biệt giữa Nâng cao Hãy thử và khẳng định

+1

Bạn cho rằng có sự lựa chọn giữa việc sử dụng nâng cao, khẳng định hoặc thử, nhưng trên thực tế chúng không thể thay thế được. Ngoài ra bạn đã không hỏi một câu hỏi. – tcooc

+1

Cảm ơn tcoc! Tôi đã thực sự có một câu hỏi mặc dù, nó được nếu có ai có thể cho tôi thấy một tình huống khi bạn chỉ có thể sử dụng một trong những chức năng này. – Defneit

+1

@Defneit Có những ví dụ như vậy trong tài liệu python. Ngoài ra, bạn nên đặt câu hỏi của bạn trong câu hỏi, không phải trong một bình luận. – Goyo

Trả lời

7

Khẳng định:

Được sử dụng khi bạn muốn "dừng lại" kịch bản dựa trên một điều kiện nhất định và trở về một cái gì đó để giúp debug nhanh hơn:

list_ = ["a","b","x"] 
assert "x" in list_, "x is not in the list" 
print("passed") 
#>> prints passed 

list_ = ["a","b","c"] 
assert "x" in list_, "x is not in the list" 
print("passed") 
#>> 
Traceback (most recent call last): 
    File "python", line 2, in <module> 
AssertionError: x is not in the list 

Raise:

Hai lý do hữu ích cho việc này:

1/Được sử dụng để thử và trừ các khối. Tăng lỗi do bạn chọn, có thể được tùy chỉnh như dưới đây và không dừng tập lệnh nếu bạn pass hoặc contiune tập lệnh; hoặc có thể là các lỗi được xác định trước raise ValueError()

class Custom_error(BaseException): 
    pass 

try: 
    print("hello") 
    raise Custom_error 
    print("world") 
except Custom_error: 
    print("found it not stopping now") 

print("im outside") 

>> hello 
>> found it not stopping now 
>> im outside 

Nhận thấy nó không dừng lại? Chúng ta có thể dừng nó bằng cách chỉ cần thoát (1) trong khối ngoại trừ.

2/Nâng cao cũng có thể được sử dụng để khắc phục lỗi hiện tại để chuyển nó lên ngăn xếp để xem liệu có điều gì khác có thể xử lý nó hay không.

except SomeError, e: 
    if not can_handle(e): 
      raise 
    someone_take_care_of_it(e) 

Try/Trừ khối:

thực hiện chính xác những gì bạn nghĩ, cố gắng một cái gì đó, nếu một lỗi đi lên, bạn bắt nó và đối phó với nó như thế nào bao giờ bạn muốn. Không có ví dụ kể từ khi có một ở trên.

4
assert cond, "text" 

được mở rộng để một cái gì đó giống như

if cond == False: 
    raise AssertionError("text") 

assert sử dụng bởi vì nó là dễ đọc hơn.

+0

Cảm ơn rất nhiều! Làm cho ý nghĩa hơn bây giờ! – Defneit

+0

Ngắn và giòn, cảm ơn :) –

5

raise - tăng ngoại lệ.

assert - tăng ngoại lệ nếu điều kiện nhất định là (hoặc không) đúng.

try - thực thi một số mã mà có thể tăng ngoại lệ và nếu có, hãy bắt nó.

1

Trường hợp ngoại lệ là những gì Python (và một số ngôn ngữ khác) sử dụng để xử lý các lỗi phát sinh khi thực thi mã. raise ExceptionName nói rằng có lỗi trong mã và chỉ định loại vấn đề là bằng cách tăng Ngoại lệ được liên kết với sự cố đó. assert expression đánh giá expression và đặt ra Ngoại lệ nếu sai.

try được sử dụng để thực thi mã có thể làm tăng ngoại lệ mà bạn mong đợi. Thay vì dừng chương trình, bạn có thể "bắt" ngoại lệ và xử lý nó trong mã của bạn.

Ví dụ: Giả sử bạn có từ điển và danh sách. Bạn muốn nhìn mọi thứ từ danh sách có trong từ điển cho đến khi bạn đạt được một điều đó không có trong từ điển:

try: 
    for item in my_list: 
     print(my_dictionary[item]) 
except KeyError as e: #KeyError is the Exception raised when a key is not in a dictionary 
    print('There is no {} in the dictionary'.format(e.args[0])) 
+0

Cảm ơn bạn rất nhiều! Bây giờ tôi có thể tiếp tục viết mã nhờ bạn! – Defneit

3

try/except khối cho phép bạn nắm bắt và quản lý ngoại lệ. Các ngoại lệ có thể được kích hoạt bởi raise, assert và một số lượng lớn các lỗi như cố gắng lập chỉ mục một danh sách trống. raise thường được sử dụng khi bạn phát hiện tình trạng lỗi. assert là tương tự nhưng ngoại lệ chỉ được nêu ra nếu một điều kiện được đáp ứng.

raiseassert có một triết lý khác. Có nhiều lỗi "bình thường" trong mã mà bạn phát hiện và tăng lỗi. Có lẽ một trang web không tồn tại hoặc một giá trị tham số nằm ngoài phạm vi.

Các xác nhận thường được dành riêng cho các vấn đề "Tôi thề không thể xảy ra" có vẻ như vẫn xảy ra. Gỡ lỗi thời gian chạy của nó giống với việc phát hiện lỗi thời gian chạy bình thường. Bạn có thể vô hiệu hóa xác nhận nếu bạn sử dụng cờ -O hoặc chạy từ .pyo tệp thay vì .pyc tệp, vì vậy chúng không phải là một phần của việc phát hiện lỗi thường xuyên.

Nếu mã chất lượng sản xuất tăng ngoại lệ, hãy tìm hiểu xem bạn đã làm gì sai. Nếu nó tăng lên một số AssertionError, bạn đã có một vấn đề lớn hơn.

+0

Cảm ơn bạn rất nhiều. Giúp tôi rất nhiều – Defneit

1

Khẳng định thường được sử dụng bởi mã kiểm tra để đảm bảo rằng một cái gì đó làm việc:

def test_bool(): 
    assert True != False 

Trong trường hợp như thử, nâng cao và trừ xử lý ngoại lệ trang điểm mà là cách ưa thích trong python để xử lý và tuyên truyền sai sót.

Hầu hết thư viện và trình xây dựng trăn sẽ tăng và Ngoại lệ của loại này hoặc loại khác nếu có sự cố. Thông thường trong mã của riêng bạn, bạn cũng sẽ muốn đưa ra một ngoại lệ khi bạn phát hiện một điều gì đó sai. Ví dụ như bạn đang viết trình xác nhận địa chỉ email và bạn muốn đưa ra một ngoại lệ nếu địa chỉ không chứa dấu @. bạn có thể có một cái gì đó tương tự (Đây là mã đồ chơi, không thực sự xác nhận email như thế này):

def validate_email(address): 
    if not "@" in address: 
     raise ValueError("Email Addresses must contain @ sign") 

Sau đó, ở một nơi khác trong mã của bạn, bạn có thể gọi hàm validate_email và nếu nó không thành công một ngoại lệ sẽ được ném ra.

try: 
    validate_email("Mynameisjoe.com") 
except ValueError as ex: 
    print("We can do some special invalid input handling here, Like ask the user to retry the input") 
finally: 
    close_my_connection() 
    print("Finally always runs whether we succeed or not. Good for clean up like shutting things down.") 

Điều quan trọng cần biết là khi ngoại lệ được tăng lên, nó sẽ được chuyển lên ngăn xếp cuộc gọi cho đến khi tìm thấy trình xử lý. Nếu nó không bao giờ tìm thấy một trình xử lý thì nó sẽ phá vỡ chương trình với ngoại lệ và theo dõi ngăn xếp.

Một điều bạn không muốn làm là một cái gì đó như:

if __name__ == '__main__': 
    try: 
     print(1/0) 
    except Exception as ex: 
     pass 

Bây giờ bạn không có cách nào biết lý do tại sao ứng dụng của bạn nổ tung.

Một điều bạn sẽ thấy thường là ok là cái gì đó như:

import logging 
if __name__ == '__main__': 
    try: 
     print(1/0) 
    except Exception as ex: 
     logging.exception(ex) 
     raise 

Mức tăng trong trường hợp này vì nó không có thông số lại tăng cùng một lỗi. Thường trong mã web bạn sẽ thấy một cái gì đó tương tự mà không tái nâng cao ngoại lệ bởi vì nó sẽ gửi lỗi 500 cho khách hàng và sau đó tiếp tục với yêu cầu tiếp theo, vì vậy trong trường hợp đó bạn không muốn chương trình kết thúc.

+0

Cảm ơn rất nhiều – Defneit

Các vấn đề liên quan