Куда отправляется инструкция try / except при вызове функции?

#python #python-3.x #error-handling #try-except

#python #python-3.x #обработка ошибок #try-except

Вопрос:

У меня есть мой основной скрипт на Python, в котором я вызываю функцию. Я хочу отслеживать любые ошибки, которые происходят во время выполнения функции, и если есть какие-либо ошибки, я хочу установить переменной error значение true. Выполняется ли оператор try / except в основном скрипте следующим образом:

 try:
  image_convert(filepath,'.jpg','RGB',2500,2500)

except:
  error = true
  

Или это делается внутри функции следующим образом:

 def image_convert(filepath,imageType,colorMode,height,width):
   try:
    imwrite(filepath[:-4]   imageType, imread(filepath)[:,:,:3].copy()) # <-- using the imagecodecs library function of imread, make a copy in memory of the TIFF File.
    # The :3 on the end of the numpy array is stripping the alpha channel from the TIFF file if it has one so it can be easily converted to a JPEG file.
    # Once the copy is made the imwrite function is creating a JPEG file from the TIFF file.
    # The [:-4] is stripping off the .tif extension from the file and the   '.jpg' is adding the .jpg extension to the newly created JPEG file.
    img = Image.open(filepath[:-4]   imageType) # <-- Using the Image.open function from the Pillow library, we are getting the newly created JPEG file and opening it.
    img = img.convert(colorMode) # <-- Using the convert function we are making sure to convert the JPEG file to RGB color mode.
    imageResize = img.resize((height, width)) # <-- Using the resize function we are resizing the JPEG to 2500 x 2500
    imageResize.save(filepath[:-4]   imageType) # <-- Using the save function, we are saving the newly sized JPEG file over the original JPEG file initially created.
    return(imageResize)
  except:
     error = true
  

Комментарии:

1. От второй версии будет мало толку, если вы не сделаете error переменную каким-либо образом доступной для вызывающего контекста.

2. Я бы не стал улавливать ошибку в функции. Если вы это сделаете, ваша функция будет беспокоиться об обработке ошибок наряду со своей реальной задачей. Если он выдает ошибку, то она выдает ошибку. Тот, кто хочет разобраться с ошибкой, может ее перехватить. Иногда это уместно, но я не вижу здесь никаких причин, по которым функция должна что-либо знать о error .

3. Может быть комбинацией обоих , в зависимости от того, какие исключения могли быть вызваны. С некоторыми из них вы можете каким-то образом справиться внутри функции, другие, возможно, лучше распространить, чтобы дать кому-то другому возможность с ними справиться.

Ответ №1:

Первый метод будет работать

 try:
    image_convert(filepath,'.jpg','RGB',2500,2500)
except:
    error = true
  

Ответ №2:

Поскольку вызов функции выполняется изнутри блока try, любые ошибки / исключения во время выполнения кода функции также попадают в область блока try и, следовательно, будут перенаправлены в блок except.

простым примером этого может быть приведенный ниже:

 def test():
    raise Exception 

try:
    test()

except:
    error = True
    print(error)
  

результат будет :

Верно