"""Явный отказ при делении потокосцепления на близкий к нулю ток.

Аргументы функции: Ψ [Вб·виток], I [А]; результат Ψ/I [Гн]. Порог
10⁻¹² А выбран для масштаба этого учебного примера. Отношение является
секущей индуктивностью и в общем нелинейном случае не равно dΨ/dI.
"""

# 1. Функция сообщает об ошибочном режиме исключением вместо ложного нуля.
def secant_inductance(linkage_wb, current_a):
    # Около нуля отношение плохо определено; порог имеет размерность ампер.
    if abs(current_a) < 1e-12:
        raise ValueError('При нулевом токе отношение потокосцепления к току не определено')
    return linkage_wb / current_a

# 2. Счётчик ошибок отделён от численных результатов успешных режимов.
errors = 0

# Проверяем нулевое возбуждение и нормальный режим линейной катушки.
for current_a in [0.0, 2.0]:
    try:
        inductance_h = secant_inductance(0.12 * current_a, current_a)
        assert abs(inductance_h - 0.12) < 1e-12
        print('Индуктивность, Гн:', inductance_h, sep=' ')
    # Обрабатываем только ожидаемый отказ; другие ошибки не скрываем.
    except ValueError as error:
        errors += 1
        print('Режим пропущен:', error, sep=' ')

# 3. Должен быть ровно один обработанный отказ при нулевом токе.
assert errors == 1
