Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

Tôi khá mới đối với Python, vì vậy tôi đã tự hỏi liệu có một sự thay thế ngắn gọn hơn để chạy hàng tấn khối try/except liên tiếp như có thể thấy dưới đây không?

try:
    project_type = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-type")]').text
except Exception:
    project_type = 'Error'
try:
    title = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-title")]').text
except Exception:
    title = 'Error'
try:
    description = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-description")]').text
except Exception:
    description = 'Error'
try:
    category = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-category")]').text
except Exception:
    category = 'Error'
...

Như đã được đề xuất trong chuỗi này hoặc chủ đề này, tôi đoán tôi có thể tạo danh sách các tên và truy vấn biến, sau đó sử dụng vòng lặp for để xây dựng từ điển cho mỗi mục container, nhưng thực sự không có lựa chọn thay thế nào khác có lẽ dễ đọc hơn?

Đã hỏi ngày 27 tháng 6 năm 2018 lúc 23:52Jun 27, 2018 at 23:52

Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

Oldboyoldboyoldboy

5.3345 Huy hiệu vàng29 Huy hiệu bạc75 Huy hiệu Đồng5 gold badges29 silver badges75 bronze badges

Lý do mà mã của bạn có rất nhiều sự lộn xộn là vì bạn có mã trùng lặp. Bạn đang thể hiện cùng một ý tưởng (tìm kiếm một giá trị, đặt mặc định nếu nó thất bại) bốn lần liên tiếp, điều đó có nghĩa là bạn sẽ phải viết cùng một mã hỗ trợ bốn lần.

Các vòng lặp là một cách tuyệt vời để sửa mã trùng lặp - vì vậy sử dụng danh sách các tên để tra cứu và tạo từ điển giá trị là giải pháp hoàn hảo cho bạn ở đây. Điều này cho phép bạn viết logic một lần và sau đó sử dụng nó nhiều lần.

(Ngoài ra: Sao chép mã của bạn đã dẫn đến một lỗi!

Đã trả lời ngày 28 tháng 6 năm 2018 lúc 0:03Jun 28, 2018 at 0:03

Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

3

Bạn có thể trừu tượng hóa cuộc gọi đến find_element_by_xpath; Điều này tránh sao chép mã và làm cho mã của bạn dễ đọc hơn:

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'

Sau đó, mã của bạn trở thành:

project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...

Đã trả lời ngày 28 tháng 6 năm 2018 lúc 0:10Jun 28, 2018 at 0:10

Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

Reblochon Masquereblochon MasqueReblochon Masque

34.3k10 Huy hiệu vàng51 Huy hiệu bạc73 Huy hiệu đồng10 gold badges51 silver badges73 bronze badges

11

1. Exception là gì?

Exception: Là những lỗi xảy ra trong quá trình thực thi một chương trình (hay còn gọi là ngoại lệ), khiến chương trình bị dừng một cách đột ngột không như mong muốn.: Là những lỗi xảy ra trong quá trình thực thi một chương trình (hay còn gọi là ngoại lệ), khiến chương trình bị dừng một cách đột ngột không như mong muốn.

Exception khiến thay đổi luồng thực thi bình thường của chương trình.

Khi một đoạn mã Python phát sinh ngoại lệ, ta cần xử lý ngoại lệ, nếu không chương trình sẽ bị dừng.

Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

Hướng dẫn xử lý ngoại lệ (exception) trong Python


2. Cơ chế xử lý Exception trong Python

Cơ chế xử lý ngoại lệ của Python được cài đặt thông qua việc sử dụng các khối lệnh: try, except

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
0.

  • Khối try: Dùng để thử lỗi. Khối try sẽ chứa các đoạn mã có khả năng gây ra lỗi: Dùng để thử lỗi. Khối try sẽ chứa các đoạn mã có khả năng gây ra lỗi
  • Khối except: Dùng để xử lý lỗi. Khối except sẽ chứa các đoạn mã xử lý lỗi được phát sinh trong khối try. Khối except có ý nghĩa giống như khối catch ở các ngôn ngữ khác như Java, C#: Dùng để xử lý lỗi. Khối except sẽ chứa các đoạn mã xử lý lỗi được phát sinh trong khối try. Khối except có ý nghĩa giống như khối catch ở các ngôn ngữ khác như Java, C#
  • Khối finally: Dùng để chứa các đoạn mã sẽ được thực thi cho dù chương trình có lỗi hay không. Khối này thường dùng để chứa các đoạn lệnh giải phóng tài nguyên sau khi thực thi xong chương trình, VD như đóng file, đóng kết nối đến CSDL v.v…: Dùng để chứa các đoạn mã sẽ được thực thi cho dù chương trình có lỗi hay không. Khối này thường dùng để chứa các đoạn lệnh giải phóng tài nguyên sau khi thực thi xong chương trình, VD như đóng file, đóng kết nối đến CSDL v.v…

​  
 

Cơ chế xử lý lỗi của Python như sau:

Nếu chương trình có lỗi, khối try sẽ dừng lại, và chương trình sẽ chuyển đến khối except để thực thi và xử lý lỗi.khối try sẽ dừng lại, và chương trình sẽ chuyển đến khối except để thực thi và xử lý lỗi.

Nếu chương trình có nhiều khối except, thì từng khối sẽ lần lượt được đánh giá theo thứ tự từ trên xuống dưới, khối nào xử lý được lỗi thì sẽ được thực thi.

Nếu chương trình không có lỗi, khối try sẽ được thực thi toàn bộ, chương trình không thực thi khối except.

Ta có thể sử dụng nhiều khối except sau khối try, trong trường hợp ta muốn xử lý nhiều loại lỗi khác nhau.

3. Ví dụ về xử lý Exception trong Python

Trong ví dụ xử lý Exception này, ta in ra giá trị của biến

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
1trong khối
def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
2. Biến
def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
3 chưa được khai báo, vì vậy khi sử dụng sẽ có lỗi.xử lý Exception này, ta in ra giá trị của biến
def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
1trong khối
def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
2
. Biến
def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
3 chưa được khai báo, vì vậy khi sử dụng sẽ có lỗi.

Trong chương trình, ta khai báo 2 khối

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
4, một khối xử lý lỗi về tên biến (
def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
5), một khối xử lý lỗi nói chung.

print(age)(age)

except NameError: NameError:

print("Bien age chua duoc dinh nghia")("Bien age chua duoc dinh nghia")

except::

print("Co loi xay ra trong chuong trinh !")  ("Co loi xay ra trong chuong trinh !")
 


> Muốn biết các loại ngoại lệ (như là

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
5) trong Python là những gì thì xem tại đây.tại đây.

Khi thực thi chương trình, ta thấy chương trình hiện thông báo lỗi như ta mong muốn.

Khối except đầu tiên được thực thi, vì ta chưa khai báo biến.

Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

Cơ chế xử lý Exception trong Python - VD1

Nếu ta thay đổi lại chương trình, ta sẽ thấy thông báo lỗi khác.

Ở đây ta đã sửa lại chương trình, ta khai báo biến

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
3, rồi in ra giá trị của biến
def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
3.

age = 5 = 5

print("age = " + age) ("age = " + age)

except NameError: NameError:

print("Bien age chua duoc dinh nghia")("Bien age chua duoc dinh nghia")

except::

print("Co loi xay ra trong chuong trinh")  ("Co loi xay ra trong chuong trinh")
 

Tuy nhiên, trong bài này, ta đã cộng chuỗi sai, vì biến

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
3 thuộc kiểu
project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
0, lẽ ra ta phải chuyển thành kiểu string.

> Lưu ý: Khi nối chuỗi trong Python thì phải sử dụng cùng kiểu dữ liệu. Vì thế ta phải chuyển age thành kiểu

project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
1Lưu ý: Khi nối chuỗi trong Python thì phải sử dụng cùng kiểu dữ liệu. Vì thế ta phải chuyển age thành kiểu
project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
1

Ta thấy chương trình đã không thực thi khối except đầu tiên (vì không có lỗi này), mà chương trình đã thực thi khối except thứ hai.

Kết quả được hiển thị như hình bên dưới.

Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

Cơ chế xử lý Exception trong Python - VD2


 

Ngoài ra, ta có thể sử dụng từ khóa

project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
2 để định nghĩa một khối lệnh sẽ được thực thi nếu không có lỗi phát sinh.

Dĩ nhiên là hành động sau khi đã thực thi khối

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
2.

Ví dụ:

print("To be or not to be") ("To be or not to be")

except::

print("Co loi xay ra !")("Co loi xay ra !")

else::

print("Ket thuc chuong trinh")  ("Ket thuc chuong trinh")
 

Trong ví dụ này, ta đã sử dụng khối

project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
4 để minh họa việc xử lý lỗi.

Tuy nhiên, trong ví dụ này, khối

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
2 không có lỗi, vì vậy chương trình không thực thi khối
def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
4, mà sẽ thực thi khối
project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
2.

Kết quả của chương trình hiển thị khối

project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
2 đúng như ta mong muốn

Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

Kết hợp sử dụng Else để để xử lý ngoại lệ trong Python

Ví dụ về sử dụng khối finally trong Python

Trong ví dụ dưới đây, ta sử dụng khối

project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
4 và try/except0.

print(x)(x)

except::

print("Co loi xay ra trong chuong trinh")("Co loi xay ra trong chuong trinh")

finally::

print("Thuc thi khoi finally !")  ("Thuc thi khoi finally !")
 

Vì biến try/except1 chưa khai báo, nên có lỗi.

Chương trình sẽ thực thi khối

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'
4, sau đó sẽ thực thi khối try/except0, vì khối finally sẽ luôn được thực hiện, bất kể chương trình có xảy ra lỗi hay không có lỗi.khối finally sẽ luôn được thực hiện, bất kể chương trình có xảy ra lỗi hay không có lỗi.

Kết quả của chương trình hiển thị đúng như ta mong muốn:

Hướng dẫn try except alternative python - thử ngoại trừ con trăn thay thế

Cơ chế hoạt động của khối Finally khi xử lý ngoại lệ trong Python


Tổng kết

Như vậy bạn đã biết cơ chế hoạt động cũng như là cách xử lý ngoại lệ trong Python. Chúng ta sẽ còn sử dụng cơ chế này rất nhiều trong quá trình lập trình. Hãy cố gắng ghi nhớ nhé.cơ chế hoạt động cũng như là cách xử lý ngoại lệ trong Python. Chúng ta sẽ còn sử dụng cơ chế này rất nhiều trong quá trình lập trình. Hãy cố gắng ghi nhớ nhé.

Chúc bạn học Python tốt!học Python tốt!

TONY HÙNG CƯỜNG