Vead

Koodi käivitamisel võivad tekkida vead, mis peatavad meie programmi töö. Vead võivad olla igasugused: kõige lihtsam ja võib-olla tihedamini esinev viga on SyntaxError, mis näitab, et kuskil koodis on süntaksi viga.

# Classic syntax error: closing quotation mark is absent.
print("Hello world!)

Üleval oleva koodi käivitamise proovimisel saame süntaksivea, mis näitab meile vea kohta ja annab kaasa täpsustava sõnumi.

Traceback (most recent call last):
  File "<path to the file>", line 3  # Number of line where the error occurred
    print("Hello world!)
                       ^
SyntaxError: EOL while scanning string literal  # Reached end of line (EOL) while scanning

Process finished with exit code 1  # Exit code 1 means abnormal finish state

Python’is taanded on ka süntaksi osa ja nende vale kasutamine põhjustab kompileerimise vigu.

def func(a, b):
return a + b # IndentationError (extends SyntaxError): indent level does not match
Traceback (most recent call last):
  File "<path to the file>", line 3  # Number of line where the error occurred
    return a + b
         ^
IndentationError: expected an indented block

Process finished with exit code 1

Veel mõned näited.

IndexError

Tekib siis, kui indeks, mille järgi proovitakse saada elementi listist, ei ole korrektne.

some_list = ["Errors", "are", "sometimes", "better", "than", "no", "errors"]

print(some_list.__len__())  # --> 7

# There is no element in the list with such index
print(some_list[7])  # --> IndexError: list index out of range
Traceback (most recent call last):
  File "<path to the file>", line 4, in <module>
    print(some_list[7]) # --> IndexError
IndexError: list index out of range

NameError

Tekib siis, kui proovitakse kasutada muutujat, mis ei olnud kunagi deklareeritud.

print(undeclared_variable + 10)  # --> NameError
Traceback (most recent call last):
  File "<path to the file>", line 2, in <module>
    print(undeclared_variable + 10)  # --> NameError
NameError: name 'undeclared_variable' is not defined

TypeError

Tekib näiteks siis, kui proovitakse teha kahe muutuja liitmist, kus üks liidetavatest on string ja teine ei ole.

var = "10"

print(var + 10)  # --> TypeError: must be str, not int (cannot concatenate objects)
Traceback (most recent call last):
  File "<path to the file>", line 5, in <module>
    print(var + 10)  # --> TypeError: cannot concatenate objects
TypeError: must be str, not int

Ehk veateade annab meile järgmist informatsiooni:

  • kus tekkib viga (koodilõik ja rea number)
  • milline viga tekkis (IndexError vms)
  • täpsustav sõnum (näiteks string’ide liitmise korral, et üks liidetavatest ei ole string)

Olukord võib olla keerulisem juhul, kui näiteks meie kutsume funktsiooni, mis omakorda kutsub teise funktsiooni, kus tekkib viga. Vaatame, mis me saame väljundiks sellel juhul.

Olgu meil on selline kood

def third(a):
    print(int(a))  # Attempt to convert string <The output is called 'Stack Trace'> to int and print it out


def second(a, b):
    c = a + b
    print(c)  # --> The output is called 'Stack Trace'

    # Calling the third function
    third(c)


def first():
    # Calling the second function
    second("The output is called ", "'Stack Trace'")

first()

Selle kompileerimisel saame

Traceback (most recent call last):

  File "<path to the file>", line 18, in <module>
    first()

  File "<path to the file>", line 15, in first
    second("The output is called ", "'Stack Trace'")

  File "<path to the file>", line 10, in second
    first(c)

  File "<path to the file>", line 2, in third
    print(int(a))  # Attempt to convert string <The output is called 'Stack Trace'> to int and print it out

ValueError: invalid literal for int() with base 10: "The output is called 'Stack Trace'"

Väljundis on näha kogu protsessi, mille teostamisel tekkis viga. Ülevalt alla:

  1. Kompilaator märkas funktsiooni first() kutset ja läks sinna (rida 16, antud mooduli sees)
  2. Funktsioon first() omakorda kutsub teise funktsiooni, second() meie poolt määratud parameetritega (rida 13, funktsiooni first() sees)
  3. Funktsioon second() teeb stringi liitmist ja kutsub funktsiooni third() (rida 9, funktsiooni second() sees)
  4. Vea tekkimise koht: proovides teisendada argumenti a numbriks, saime ValueError: invalid literal for int() with base 10: "The output is called 'Stack Trace'"