Функция seterrcall
Функция seterrcall устанавливает пользовательский обратный вызов
для обработки ошибок, возникающих при выполнении численных операций.
Она позволяет перехватывать предупреждения и ошибки, такие как деление на ноль,
переполнение, потеря значимости и другие, и обрабатывать их пользовательским
способом. Функция принимает один параметр - вызываемый объект, который будет
получать три аргумента: тип ошибки, строку с описанием ошибки и объект ошибки.
Синтаксис
np.seterrcall(callable)
Параметры функции:
-
callable- пользовательская функция обратного вызова. Она должна принимать три параметра: тип ошибки (например, 'divide' или 'over'), текст ошибки и объект ошибки типаWarningилиError. Если передатьNone, то функция сбрасывает ранее установленный обработчик.
Возвращаемое значение: предыдущая функция обратного вызова, если она была установлена,
или None. Это позволяет сохранять и восстанавливать обработчики.
Пример
Установим простой обработчик ошибок, который выводит информацию в консоль:
import numpy as np
# User-defined error handler
def error_handler(err_type, err_msg, err_obj):
print(f"Error type: {err_type}")
print(f"Error message: {err_msg}")
print(f"Error object: {err_obj}")
# Set the callback
old_handler = np.seterrcall(error_handler)
# Set error behavior to 'call'
np.seterr(divide='call', over='call')
# Trigger a division by zero error
arr = np.array([1, 0, 2])
res = np.divide(1, arr)
Результат выполнения кода:
Error type: divide
Error message: divide by zero encountered in divide
Error object: <numpy.core._exceptions.UFuncWarning object at 0x...>
Пример
Создадим обработчик, который сохраняет информацию об ошибках в список для последующего анализа:
import numpy as np
# List to store error logs
error_log = []
# User-defined error handler
def log_handler(err_type, err_msg, err_obj):
error_log.append({
'type': err_type,
'message': err_msg,
'object': err_obj
})
print(f"Logged error: {err_type} - {err_msg}")
# Set the callback
np.seterrcall(log_handler)
np.seterr(divide='call', over='call')
# Trigger some errors
arr1 = np.array([1, 0, 3])
res1 = np.divide(1, arr1)
arr2 = np.array([1e308, 1e308])
res2 = np.multiply(arr2, arr2)
print(f"Total errors logged: {len(error_log)}")
Результат выполнения кода:
Logged error: divide - divide by zero encountered in divide
Logged error: over - overflow encountered in multiply
Total errors logged: 2
Пример
Сбросим установленный обработчик, передав None в функцию:
import numpy as np
# User-defined error handler
def custom_handler(err_type, err_msg, err_obj):
print(f"Handling error: {err_type}")
# Set the callback
old_handler = np.seterrcall(custom_handler)
np.seterr(divide='call')
# Trigger an error
arr = np.array([1, 0, 2])
res = np.divide(1, arr)
# Reset callback
np.seterrcall(None)
print("Callback reset")
# Trigger another error
res = np.divide(1, arr)
Результат выполнения кода:
Handling error: divide
Callback reset
После сброса обработчика ошибка больше не обрабатывается пользовательской функцией.
Смотрите также
-
функцию
seterr,
которая устанавливает поведение при возникновении ошибок -
функцию
geterr,
которая возвращает текущие настройки обработки ошибок -
функцию
geterrcall,
которая возвращает текущую функцию обратного вызова -
функцию
set_printoptions,
которая настраивает форматирование вывода массивов