2015-01-27 2 views
0

Я хочу создать собственные сообщения об ошибках для функции.Ввод пользовательских сообщений об ошибках в Python

def tr(launch_speed , launch_angle_deg , num_samples): 

#Error displays 
    try: 
     launch_speed>0 
    except: 
     raise Exception("Launch speed has to be positive!") 
    try: 
     0<launch_angle_deg<90 
    except: 
     raise Exception("Launch angle has to be 0 to 90 degrees!")  
    try: 
     um_samples = int(input()) 
    except: 
     raise Exception("Integer amount of samples!") 
    try: 
     num_samples >=2 
    except: 
     raise Exception("At least 2 samples!")  

По сути, то, что я хочу, чтобы получить сообщение об ошибке каждый раз, когда неверное значение было написано в функциональных переменных, и я попытался создать эти сообщения, основанные на том, что я собрал в интернете, но он, похоже, не работает.

+1

Не могли бы вы быть более конкретными, чем * «он не работает» *? Почему вы ожидаете, например? 'launch_speed> 0', чтобы поднять ошибку? – jonrsharpe

+0

Я строю функцию, которая вычисляет траекторию снаряда, поэтому я бы не хотел, чтобы скорость запуска была отрицательной – George

ответ

2

Вы не можете использовать try: except: для всех; например, launch_speed>0не будет поднять ошибку для отрицательных значений. Вместо этого, я думаю, вы хотите, например,

if launch_speed < 0: # note spacing, and if not try 
    raise ValueError("Launch speed must be positive.") # note specific error 

Вы должны также проверить и поднять более конкретные ошибки (см "the evils of except"), например .:

try: 
    num_samples = int(raw_input()) # don't use input in 2.x 
except ValueError: # note specific error 
    raise TypeError("Integer amount of samples!") 

Вы можете увидеть список встроенных ошибок in the documentation.

+0

Итак, я попытался использовать вторую для num_samples, но даже если я буду вводить, например, 5.5, я получу результат для моей функции, а не ошибка. – George

+0

@George вы должны использовать 'raw_input', а не' input'; Я соответствующим образом обновил ответ. – jonrsharpe

+0

@George Если вы специально хотите выбросить ошибку, если пользователь дает вам нецелое число, вы должны сделать что-то вроде 'user_in = raw_input(); if int (user_in)! = float (user_in): raise SomeError («С помощью специального сообщения») '. Однако мне кажется более полезным, чтобы просто преобразовать его в нечто полезное и использовать его, только жалуясь, если он не конвертируется в 'int' –

1

Почему бы не сделать еще один шаг и создать собственные типы исключений? Там быстрый учебник in the docs, который можно было бы использовать что-то вроде:

class Error(Exception): 
    """Base class for exceptions defined in this module""" 
    pass 

class LaunchError(Error): 
    """Errors related to the launch""" 
    pass 

class LaunchSpeedError(LaunchError): 
    """Launch speed is wrong""" 
    pass 

class LaunchAngleError(LaunchError): 
    """Launch angle is wrong""" 
    pass 

class SamplesError(Error): 
    """Error relating to samples""" 
    pass 

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

if launch_speed < 0: 
    raise LaunchSpeedError("Launch speed must be positive") 
if 0 <= launch_angle < 90: 
    raise LaunchAngleError("Launch angle must be between 0 and 90") 
um_samples = input() 
try: 
    um_samples = int(um_samples) 
except ValueError: 
    raise SampleError("Samples must be an integer, not {}".format(um_samples)) 
if um_samples < 2: 
    raise SampleError("Must include more than one sample, not {}".format(str(um_samples))) 
Смежные вопросы