Как Предотвращение Ошибки

У меня есть список с 2 элементами a=[1,2] если я помещаю например [2], так как он пометит

> > Traceback (most recent call last):   File "<pyshell#13>", line 1, in <module>
>     if a[2]== IndexError(): IndexError: list index out of range

Если я размещаю один if чтобы 'это решает' что сказал например:

 if a[2]== IndexError: 
       print('Fuera de Rango')

Логик Но будет служить.

Который там несколько способов решать эту проблему как например:

if a[2]==len(a):
    print('Fuera de Rango')

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

Спасибо! и я надеюсь заставить меня понимать.

2
задан 25.03.2018, 21:10
2 ответа

Если ты хочешь избежать того, чтобы программа покончила с одной excepciГіn из-за того, чтобы не пробовать индексированный с Г-ndice вне ранга ни одного из выборов, что образцы оно будет функционировать, в моменте, который пробует оценить a[2] tendrГЎs IndexError.

С условным, кто подтверждал бы длину списка и подтверждал, - ли Г-ndice vГЎlido deberГ, - чтобы делать что-то asГ-:

a = [1, 2]

indice = 2

if not -len(a) <= indice < len(a):
    print('Fuera de Rango')
else:
    print(a[indice])

Тем не менее ты можешь использовать блок try-except, чтобы захватывать ее excepciГіn и манипулировать ею segГєn сочти подходящим:

a = [1, 2]

indice = 2

try:
    print(a[indice])

except IndexError:
    print("Fuera de rango")

BГЎsicamente intГ©rprete пробует осуществлять то, что есть внутри try, в случае когда не удается из-за одного IndexError, осуществляет то, что есть внутри except. Ты можешь захватывать любой excepciГіn, если за except не следовали никакой ошибки формы explГ-встреча, хотя как нужно воображать это может быть большая причина ошибок, которые происходят утоенные:

try:
    print(lista[indice])

except:
    print("Algún error ocurrió")

ты Можешь манипулировать различными ошибками дифференцированной формы используя несколько решений except:

try:
    print(lista[indice])

except IndexError:
    print("Índice fuera de rango")

except TypeError:
    print("Los indices de una lista han de ser enteros")

Или захватывать несколько типов в том же блоке используя tupla:

try:
    print(lista[indice])

except (IndexError, TypeError):
    print("Índice no válido")

ты Можешь использовать одну funciГіn, что возвратил тебе элемент списка, если он существует, или стоимость, которую ты хотел бы в противоположном случае, не бросая одной excepciГіn используя ту же идею (что-то похожее на то, что делает mГ©todo dict.get например).

a = [1, 2]


def get_list_element(lista, indice, default=None):
    try:
        return lista[indice]
    except IndexError:
        return default


elemento = get_list_element(a, 2)
print(elemento)  # None
elemento = get_list_element(a, 1)
print(elemento)  # 2
elemento = get_list_element(a, 2, default=0)
print(elemento)  # 0

Существуют mГЎs выборы mГЎs "изысканные" создавая наше сам класс контейнер или получая в наследство (не рекомендуемый в пользу мотивов, которые он не приходит в случай) / составляя начиная с list. Тем не менее, если требуют контейнера, который осуществлял бы функциональность list, но настроенный opciГіn он состоит в том, чтобы получать в наследство хорошую одну от collections.UserList:

import collections



class MyList(collections.UserList):
    def  __getitem__(self, item, *args):
        try:
            return self.data.__getitem__(item)
        except IndexError:
            return None



a = MyList((1, 2))
print(a[1])  # 2
print(a[2])  # None
a.append(4)
print(a[2])  # 4

Класс MyList осуществляет всю функциональность списка, но если мы индексируем с неправильным Г-ndice, нас возвращает None, не бросает одну excepciГіn.

4
ответ дан 24.11.2019, 00:40

Ошибки, которые случаются во времени ejecuciГіn (а именно, когда estГЎ выполняя одну instrucciГіn он делает конкретным), они освобождают то, что называет одной excepciГіn .

Исключения могут быть захваченными с самого cГіdigo и брать одну decisiГіn в Г©l относительно quГ© делать. SГіlo, когда они не захватываются, они заканчивают тем, что выходят ввиду пользователя показывая такой Traceback как который ты поместил в твоем вопросе. В этот Traceback информируют, что quГ© excepciГіn он случился, и в quГ© lГ-nea cГіdigo, asГ - как quГ© функции были в ejecuciГіn в этом моменте (а именно, с quГ© funciГіn habГ - в названный к той, которая causГі excepciГіn, и с cuГЎl habГ - в названный в свою очередь, и т.д.)

В documentaciГіn ты имеешь по отношению к предыдущей, все детали на cГіmo манипулировать исключениями , или cГіmo бросать твои собственные.

Краткий resГєmen serГ - в siguente.

Манипулировать исключениями

, Когда ты будешь выполнять блок cГіdigo, что podrГ, - которые будет нужно бить козырем с одной excepciГіn, помести этот блок cГіdigo внутри одной clГЎusula try:. В continuaciГіn этой clГЎusula помести другой вызов except X:, это будьте X имя одной excepciГіn. Внутри этого второго блока, ты пишешь cГіdigo, что serГЎ выполненный в случае, если он произведет ее ему excepciГіn X. Блок except X ты можешь повторять это несколько раз с различными случаями X, чтобы манипулировать различной формы каждый excepciГіn.

AsГ-:

try:
    dato = a[2]
except IndexError:
    print("Fuera de rango")
    dato = 0

FГ-jate, что, когда случается одна excepciГіn, ademГЎs (или вместо) печатать quГ© ошибку произошло, ты должен брать какую-то acciГіn ревизионный корректор. В предыдущем примере я предположил, что querГ-хозяева соглашаться на информацию, и что, если мы выходим из ранга информация, я делаю это равным нулю. Это может иметь смысл в тебе aplicaciГіn или не иметь это. Завись quГ© сделаешь потом с этой информацией. Другая opciГіn podrГ, - чтобы состоять в том, чтобы делать dato равным None. Другая opciГіn mГЎs podrГ, - чтобы состоять в том, чтобы рождать преждевременно ее ejecuciГіn программы с quit(), чтобы избегать того, чтобы он продолжил ничего не выполнять mГЎs (что заканчивает тем, что является тем, что он делает python, когда он находит одну excepciГіn не манипулируемая из-за cГіdigo).

Бросать собственные ты excepciГіn

TambiГ©n ты можешь писать одну funciГіn, что будет назван с другого сайта, и хочешь обнаружить возможные ошибки и сообщить тому, кто ты llamГі о том, что произошла одна из этих ошибок. Когда ты хочешь сделать это, ты можешь помещать raise X(), это X имя ее excepciГіn, который ты хочешь поднять. Смоги быть одна из тех, которые python он считает уже определенными, или другие, которые ты создал бы (serГ-an классы, которые они получали в наследство бы прямо или косвенно от класса Exception).

Например ты cГіdigo podrГ, - чтобы содержать что-то как:

def obtener_elemento(a, n):
    if len(a) < n:
        raise IndexError("n debe ser menor que {}".format(len(a)))
    else:
        return a[n]

, Который назвал эту funciГіn перемещая n неправильного encontrarГ - в с нею excepciГіn IndexError, который был брошен с тебя cГіdigo, войдя из-за if. Если он не манипулировал этой excepciГіn используя try/catch, она excepciГіn subirГЎ в следующую funciГіn, что позвонил, в которую llamГі в твою. Если в конце концов подходит близко в главную программу без того, чтобы никто не отнесся к ней excepciГіn, программа romperГЎ и он mostrarГЎ в пользователя сообщение, которое мы поместили, бросив ее excepciГіn.

MГЎs детали в она documentaciГіn раньше упомянутые .

3
ответ дан 24.11.2019, 00:40
  • 1
    Спасибо друг, очень ú til это funció n Raise. –  DDR 24.03.2018, 21:35