2 Вопрос: ПИТОН: Как отловить исключение для множественной проверки в блоке try?

вопрос создан в Mon, Mar 18, 2019 12:00 AM

Как отловить исключение для множественной проверки в одном блоке try? Это возможно или мне нужно использовать несколько блоков try для этого? Вот мой код:

import sys

def math_func(num1, num2):
    return num1*num2

a,b = map(str,sys.stdin.readline().split(' '))
try:
    a = int(a)        
    b = int(b)
    print("Result is - ", math_func(a,b), "\n")
except FirstException: # For A
    print("A is not an int!")
except SecondException: # For B
    print("B is not an int!")
    
0
  1. если вы получили правильный ответ, вы можете поставить галочку напротив наиболее подходящего ответа
    2019-03-18 14: 21: 13Z
2 ответа                              2                         

Python верит в явную обработку исключений. Если вы хотите знать, какая строка вызывает исключение, не используйте множественные исключения. В вашем случае вам не нужны отдельные обработчики исключений, поскольку вы не выполняете никаких условных операций, основанных на конкретной строке, вызывающей исключение.

import sys
import traceback

def math_func(num1, num2):
    return num1*num2

a,b = map(str, sys.stdin.readline().split(' '))
try:
    a = int(a)        
    b = int(b)
    print("Result is - ", math_func(a,b), "\n")
except ValueError: 
    print(traceback.format_exc())

Это напечатает, какая строка вызывает ошибку

    
1
2019-03-18 11: 29: 51Z
  1. спасибо за ваши ценные комментарии. Но предположим, что мне нужно 20 проверок, и я хочу точно знать, что является причиной проблемы. Это возможно, или я должен создать отдельный блок try для них всех.
    2019-03-19 04: 50: 39Z
  2. @ Tsmk, если проверки одинаковы, т.е. int(<any_variable>), тогда это будет предпочтительным способом. Если есть другие валидаторы, используйте их исключения, такие как KeyError и т. Д. Это поможет вам дифференцироваться на основе типа исключений. Вы делаете какую-либо конкретную операцию для каждой проверки?
    2019-03-19 11: 10: 10Z

Вы действительно можете поймать два исключения в одном блоке, это можно сделать так:

import sys
def mathFunc(No1,No2):
    return No1*No2
a,b = map(str,sys.stdin.readline().split(' '))
    try:
        a = int(a)        
        b = int(b)
        print("Result is - ",mathFunc(a,b),"\n")
    except (FirstException, SecondException) as e: 
        if(isinstance(e, FirstException)):
            # put logic for a here
        elif(isinstance(e, SecondException)):
            # put logic for be here
        # ... repeat for more exceptions

Вы также можете просто перехватить универсальный Exception, это удобно, когда нужно сохранить исключение программы во время выполнения, но лучше избегать этого и вместо этого перехватывать определенные исключения

Надеюсь, это поможет!

Возможно, дубликат этого ?

    
0
2019-03-18 11: 22: 21Z
  1. Проблема OP заключается не в том, чтобы перехватить различные типы исключений в одной попытке /за исключением того, что она знает, какая часть внутри предложения try (a = или b =) вызывает то же исключение ( ValueError в данном случае)
    2019-03-18 12: 11: 30Z
источник размещен Вот