10 уобичајених типова Питхон грешака и како их решити

Као програмер, сигурно ћете наићи на грешке током развоја софтвера. Ово може да варира од грешака у вашој логици које доводе до неочекиваних резултата, грешака које произилазе из кршења правила програмског језика, чак и до грешака које се јављају током покретања вашег програма, између многих других. Ове грешке се обично називају грешкама.

Грешке су свеприсутне у сваком програмском језику, без обзира на то колико је лако научити или користити језик.

У Питхон-у, на пример, иако језик наглашава читљивост, прати експресивну синтаксу и сматра се релативно лаким за учење и коришћење у поређењу са другим програмским језицима, још увек нисте имуни на грешке у програмирању када користите Питхон.

Пошто се грешке неминовно појављују, добар начин да се позабавите њима јесте да научите о различитим врстама грешака које могу да настану и како настају. Ово вам омогућава да избегнете или минимизирате ове грешке током програмирања и такође знате како да се носите са њима када се појаве.

Ево неких од уобичајених Питхон грешака на које можете наићи док програмирате користећи језик:

СинтакЕррорс

Синтаксичка грешка је грешка која се јавља када пишете код који крши правила програмског језика који користите. Ово доводи до неважеће линије кода.

У Питхон-у, на пример, када се штампа стринг, треба га ставити између наводника. Ако то не учините, долази до синтаксичке грешке.

Синтаксичка грешка такође може да настане када пропустите отварање или затварање заграда, угластих или витичастих заграда, погрешно написане кључне речи или имена функција, пропустите двотачке на крају исказа контроле тока или када пропустите потребне операторе у изразима.

Генерално, синтаксичке грешке ће настати ако прекршите правило о томе како треба да буде написан Питхон код.

## syntax error arising from missing quotation mark
## around the string being printed
print("Hello World)

age = 20
## Syntax error arising from missing colon in an if statement
if age > 18
    print("Age is over 18")

## Syntax error because '(' was never closed
def square(x:
    return x * x
print(square(4))

Када покренете горњи код, наићи ћете на поруку о грешци као што је приказано у наставку:

Порука о грешци при покретању кода је следећа:

  File "/home/madici/Desktop/helloworld.py", line 1
    print("Hello World)
          ^
SyntaxError: unterminated string literal (detected at line 1)

Да бисте решили ове грешке, користите праву Питхон синтаксу као што је приказано у наставку:

print("Hello World")

age = 20
if age > 18:
    print("Age is over 18")

def square(x):
    return x * x
print(square(4))

ИндентатионЕррор

За разлику од других језика као што су Јава, Ц или Ц++, који користе витичасте заграде за раздвајање блокова кода, Питхон користи увлачење да дефинише хијерархију и структуру блокова кода. На пример, када пишете контролне наредбе у Јави, сав код који треба да се изврши након процене услова налази се унутар витичастих заграда.

У Питхон-у ће, међутим, блок кода бити увучен. Типично увлачење у Питхон-у састоји се од четири размака или једног табулатора. Међутим, број размака није битан све док остаје доследан током кода који се пише.

Као Питхон програмер, вероватно ћете наићи на грешке у увлачењу када не успете да додате потребно увлачење, као што је када пишете контролне изјаве или функције, када користите и таб и размаке за креирање увлачења јер то збуњује тумач, када ставите увлаке на погрешном месту или када ваша увлачења нису доследна у вашој бази кода.

  6 најбољих алата за ВАН оптимизацију које смо тестирали 2020

Пример кода који резултира грешком увлачења је приказан у наставку:

age = 20
if age > 18:
print("Age is greater than 18")
   print("You're allowed to drive")
else:
    print("Age is less than 18")

Поруке о грешци које су резултат кода изнад су приказане у наставку:

Порука о грешци при покретању кода је следећа:

  File "/home/madici/Desktop/helloworld.py", line 3
    print("Age is greater than 18")
    ^
IndentationError: expected an indented block after 'if' statement on line 2

Да бисте исправили грешке, потребно је увући ред после изјаве иф као увлачење и обезбедити да се подудара са увлачењем у остатку кода као што је приказано у наставку:

age = 20
if age > 18:
   print("Age is greater than 18")
   print("You're allowed to drive")
else:
   print("Age is less than 18")

ТипеЕррор

У Питхон-у, ТипеЕррор је изузетак који настаје када покушате да извршите операцију користећи некомпатибилан тип података. На пример, ако покушате да додате стринг и цео број или спојите низ типа података са целим бројем, наићи ћете на ТипеЕррор.

Такође можете наићи на ТипеЕррорс када користите функције или методе са погрешним типовима података, када покушате да користите нецелобројни индекс за приступ ставкама у итерабле као што је листа, или када покушате да итерирате кроз објекат који не може бити итерабле.

Генерално, свака операција која користи нетачан тип података ће довести до ТипеЕррор.

Примери операција које могу довести до ТипеЕррорс су приказани у наставку:

# Type Error resulting from concatenating a string an an integer
age = 25
message = "I am " + age + " years old."


list1 = [1, "hello", 5, "world", 18, 2021]
#Type errors resulting from wrong usage of builtin in methods
print(sum(list1))

#TypeError resulting from adding a string and an integer
num1 = 10
num2 = "16"
print(num1 + num2)

#TypeError resulting from using a non integer index
list2 = ["hello", "from", "the", "other", "side"]
print(list2["1"])

Поруке о грешкама које су резултат кода изнад приказане су у наставку:

Пример ТипеЕррор поруке из кода је приказан у наставку:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    message = "I am " + age + " years old."
              ~~~~~~~~^~~~~
TypeError: can only concatenate str (not "int") to str

Да бисте уклонили грешке, користите исправне типове података или конверзије типова као што је приказано у наставку:

age = 25
message = "I am " + str(age) + " years old."

list1 = [1, 5, 18, 2021]
print(sum(list1))

num1 = 10
num2 = "16"
print(num1 + int(num2))

list2 = ["hello", "from", "the", "other", "side"]
print(list2[1])

АттрибутеЕррор

У Питхон-у, АттрибутеЕррор се јавља када покушате да користите атрибут који не постоји на објекту или позовете метод који не постоји на објекту на коме се позива. АттрибутеЕррор показује да објекат нема атрибут или метод који се позива на њему.

На пример, ако позовете метод низа на целом броју, наићи ћете на АттрибутеЕррор јер метода не постоји на типу објекта на ком га позивате.

У примеру приказаном испод, метода цапитализе() која се користи за претварање првог слова стринга у велика слова, позива се на целом броју. Резултат је грешка атрибута јер инт нема методу цапитализе().

# AttributeError arising from calling capitalize() on an int value
num = 1445
cap = num.capitalize()
print(cap)

Покретање овог кода резултира доле приказаном поруком о грешци:

Порука АттрибутеЕррор из кода је следећа:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    cap = num.capitalize()
          ^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'capitalize'

Да бисте решили АттрибутеЕррор, уверите се да метод или атрибут који позивате постоји на типу објекта на ком га позивате. У овом случају, позивање цапитализе() на стринг типу података решава ову грешку као што је приказано у наставку:

ИмпортЕррор

ИмпортЕррор у Питхон-у се јавља када покушате да увезете модул који се не може пронаћи или није доступан у вашем тренутном окружењу. Можда још није инсталиран, нисте правилно конфигурисали његову путању или сте погрешно написали модул који покушавате да инсталирате.

  АндаСеат-ови 'Цхеат Цодес': Догађај ограниченог времена

ИмпортЕррор има једну подкласу која се зове МодулеНотФоундЕррор, што је грешка која се јавља када покушате да увезете модул који није могуће пронаћи.

На пример, код у наставку са покушајем да увезе библиотеку анализе података пандас даје такву грешку јер модул још није инсталиран.

Генерисана порука ИмпортЕррор је приказана у наставку:

  File "/home/madici/Desktop/helloworld.py", line 1, in <module>
    import pandas
ModuleNotFoundError: No module named 'pandas'

Да бисте решили такву грешку, уверите се да су модули које покушавате да увезете инсталирани. У случају да то не реши грешку, проверите да ли користите исправан правопис за модул и исправну путању датотеке за приступ модулу.

ВалуеЕррор

Ово је изузетак који се јавља када функција у Питхон-у прими вредност исправног типа података, али је та вредност неприкладна. На пример, функција Матх.скрт() која се користи за проналажење квадратног корена нумеричких вредности ће вратити ВалуеЕррор ако проследите негативан број.

Колико год вредност била исправног типа, то је нумеричка вредност, негативна је чини неприкладном вредношћу за

Функција инт() која конвертује број или стринг ће вратити ВалуеЕррор ако проследите низ који није нумеричка вредност стринга. Прослеђивање „123“ или „45“ функцији не враћа грешку јер се низови могу конвертовати у одговарајућу целобројну вредност.

Међутим, ако проследите стринг који није нумеричка вредност стринга, као што је „Здраво“, он враћа ВалуеЕррор. То је зато што „Здраво“ иако је стринг, није прикладно јер нема целобројни еквивалент.

Пример кода који генерише ВалуеЕррор је приказан у наставку:

# Value error resulting from inappropriate int value in sqrt()
import math
num = -64
root = math.sqrt(num)
print(root)

# Value error resulting from passing a string with no integer
# equivalent into int() function
numString = "Hello"
num = int(numString)
print(num)

Грешке из кода изнад су приказане у наставку:

Генерисана порука о грешци је следећа:

  File "/home/madici/Desktop/helloworld.py", line 4, in <module>
    root = math.sqrt(num)
           ^^^^^^^^^^^^^^
ValueError: math domain error

Да бисте исправили грешку, користите одговарајуће вредности у функцијама као што је приказано у наставку:

import math
num = 64
root = math.sqrt(num)
print(root)

numString = "5231"
num = int(numString)
print(num)

ИОЕррор

ИОЕррор (Инпут/Оутпут Еррор) је изузетак који се јавља када улазна или излазна операција не успе. Ово може бити узроковано покушајем приступа датотеци која не постоји, недовољним складишним простором на вашем уређају, покушајем да приступите датотеци којој немате довољно дозвола за приступ или када покушате да приступите датотеци која се тренутно користи другим операцијама.

Методе као што су опен(), реад(), врите() и цлосе() које се обично користе при раду са датотекама су оне које ће вероватно изазвати такву грешку.

Размотрите код испод који покушава да отвори датотеку под називом „нотес.ткт“ која не постоји. Код резултира ИОЕррор који подиже ФилеНотФоундЕррор:

Са следећом поруком о грешци:

  File "/home/madici/Desktop/helloworld.py", line 2, in <module>
    file1 = open("notes.txt", "r")
            ^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'notes.txt'

Да бисте избегли горњу грешку, све што треба да урадите је да обезбедите да датотека „нотес.ткт“ постоји у директоријуму у којем покрећете терминал. Други начин за решавање ИОЕррорс је коришћење блока три осим, ​​као што је приказано у наставку:

НамеЕррор

НамеЕррор је изузетак на који ћете наићи када покушате да користите променљиву, функцију или модул који не постоји, није дефинисан у тренутном опсегу или му није додељена вредност.

Таква грешка се обично јавља када погрешно напишете имена променљивих или функција или их користите пре него што буду дефинисани. Коришћење модула без његовог увоза ће такође довести до грешке у имену.

  Како креирати, монтирати и снимити ИСО датотеку у Линуку

Следећи код ће резултирати изузетком НамеЕррор:

# name error arises because the math module has not been imported
num = 64
root = math.sqrt(64)
print(root)

# NameError arises because x is used before it is defined
y = 23
print(x)

#NameEror because function name is not defined
def greet():
    print("Good morning")
great() #ameError: name 'great' is not defined

Следеће поруке о грешци су резултат кода изнад:

Пример поруке НамеЕррор је приказан испод:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    root = math.sqrt(64)
           ^^^^
NameError: name 'math' is not defined

Да бисте решили такву НамеЕррор, уверите се да не користите модуле пре него што их увезете, да не користите променљиве или функције пре него што их дефинишете и да нисте погрешно написали имена функција или променљивих:

import math
num = 64
root = math.sqrt(64)
print(root)

y = 23
print(y)

def greet():
    print("Good morning")
greet()

ИндекЕррор

ИндекЕррор је изузетак који се јавља када покушате да приступите индексу на листи или тупле-у који је ван опсега. Размотрите листу испод:

list1 = [1, 2, 3, 4, 5]

Листа има пет елемената. Питхон броји индексе од 0 (нула). Према томе, листа изнад има индексе у распону од 0 до н-1, при чему је н број или елементи на листи. У овом случају, индекс или листа ће се кретати од 0 до 4.

Ако покушате да приступите елементу са индексом већим од 4, наићи ћете на ИндекЕррор јер је индекс ван опсега на листи са које покушавате да приступите елементу. Код у наставку генерише ИндекЕррор:

list1 = [1, 2, 3, 4, 5]
item = list1[6] #IndexError because the list index is out of range
print(item)

Грешка из кода је приказана у наставку:

Генерисана порука ИндекЕррор је следећа:

  File "/home/madici/Desktop/helloworld.py", line 2, in <module>
    item = list1[6] #IndexError because the list index is out of range
           ~~~~~^^^
IndexError: list index out of range

Најбољи начин да избегнете ИндекЕррор је да користите функције ранге() и лен() како бисте били сигурни да приступате само елементима који су у домету на следећи начин:

list1 = [1, 2, 3, 4, 5]

for i in range(len(list1)):
    print(list1[i])

КеиЕррор

КеиЕррор је изузетак који се јавља када покушате да приступите ставци из речника помоћу кључа, а кључ није пронађен у речнику. Размотрите речник у наставку:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

Кључеви у речнику су „Канада“, „САД“, „Италија“. Можете приступити ставкама из речника градова помоћу три тастера. Међутим, ако покушате да приступите елементу помоћу кључа који не постоји, као што је „Бразил“, наићи ћете на КеиЕррор, као што је приказано у наставку:

Генерисана порука КеиЕррор је приказана у наставку:

  File "/home/madici/Desktop/helloworld.py", line 6, in <module>
    print(cities["Brazil"])
          ~~~~~~^^^^^^^^^^
KeyError: 'Brazil'

Да бисте решили КеиЕррор, уверите се да су кључеви које користите за приступ елементима у речнику заиста присутни у речнику. Да бисте то урадили, можете да наведете иф…елсе изјаву на следећи начин:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

country = "Canada"

if country in cities:
    print("The capital city of " + country + " is " + cities[country])
else:
	print("The key " + country + " is not present in the cities dictionary")

На овај начин ћете избећи да наиђете на КеиЕррорс када приступате елементима из речника

Закључак

Када кодирате у Питхон-у, без обзира на ваш ниво стручности, сигурно ћете наићи на грешке. Стога, обавезно се упознајте са различитим типовима грешака истакнутим у чланку како бисте били сигурни да ћете моћи да их решите када се појаве.

Такође можете да истражите неке корисне Питхон једноструке речи да бисте поједноставили уобичајене задатке.