Множественные исключения в python - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь использовать два except в следующем коде:

try:
    Contributions = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[5]/tbody/tr[5]/td[2]/span').text
    Expenditures = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[5]/tbody/tr[7]/td[2]/span').text

except NoSuchElementException:
    Contributions = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[5]/td[2]/span').text
    Expenditures = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[7]/td[2]/span').text

except NoSuchElementException:
    Contributions = None
    Expenditures = None

Я получаю следующее сообщение об ошибке:

#First Error
NoSuchElementException                    Traceback (most recent call last)

#Second Error
During handling of the above exception, another exception occurred:
NoSuchElementException                    Traceback (most recent call last)

#Third Error
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[5]/td[2]/span"}
  (Session info: chrome=83.0.4103.97)


По какой-то причине код застревает на втором исключении и не пытается выполнить третий за исключением.

Если элемент не может быть найден после второго исключения, я просто хочу заполнить Contributions и Expenditures отсутствующим и позволить коду пройти .

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Вам необходимо вложить блоки try / except.

try:
    Contributions = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[5]/tbody/tr[5]/td[2]/span').text
    Expenditures = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[5]/tbody/tr[7]/td[2]/span').text

except NoSuchElementException:
    try:
        Contributions = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[5]/td[2]/span').text
        Expenditures = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[7]/td[2]/span').text

    except NoSuchElementException:
        Contributions = None
        Expenditures = None
1 голос
/ 16 июня 2020

Лучший способ использовать то же исключение - использовать внутреннее исключение

try:
    Contributions = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[5]/tbody/tr[5]/td[2]/span').text
    Expenditures = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[5]/tbody/tr[7]/td[2]/span').text

except NoSuchElementException:
    try:
        Contributions = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[5]/td[2]/span').text
        Expenditures = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[7]/td[2]/span').text

    except NoSuchElementException:
        Contributions = None
        Expenditures = None
1 голос
/ 16 июня 2020

Это единственный блок try. Исключения, созданные в первом блоке except, будут возникать из этого сегмента кода, а не во втором блоке except.

Если вы хотите перехватить исключения, созданные в первом блоке except, вложите это во втором блоке try.

  try:
    Contributions = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[5]/tbody/tr[5]/td[2]/span').text
    Expenditures = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[5]/tbody/tr[7]/td[2]/span').text

  except NoSuchElementException:
    try:
      Contributions = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[5]/td[2]/span').text
      Expenditures = driver.find_element_by_xpath('//*[@id="_ctl0"]/table[2]/tbody/tr[2]/td[2]/table[4]/tbody/tr[7]/td[2]/span').text

    except NoSuchElementException:
     Contributions = None
     Expenditures = None
...