← Назад к вопросам
В чем разница между Runtime error и Compilation error?
1.3 Junior🔥 221 комментариев
#Python
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Runtime Error vs Compilation Error
Это фундаментальное различие в типах ошибок в программировании. Важно понимать, когда они возникают и как их ловить.
Compilation Error: Ошибки на этапе компиляции
Когда возникает: При компиляции/интерпретации кода, ДО его выполнения
Причины:
- Синтаксические ошибки
- Type mismatch (неправильный тип данных)
- Использование несуществующей переменной/функции
- Нарушение правил языка программирования
Примеры в Python (интерпретируемый язык):
# ❌ Синтаксическая ошибка
if x > 5 # Забыли : (двоеточие)
print(x)
# Результат: SyntaxError: invalid syntax
# ❌ Недопустимая операция для типа
x = "hello"
y = x + 5 # Нельзя складывать строку и число
# Результат: TypeError: can only concatenate str (not "int") to str
# ❌ Несуществующая функция
result = calculate(10) # Функция не определена
# Результат: NameError: name 'calculate' is not defined
В скомпилированных языках (Java, C++):
// Java
public class Main {
public static void main(String[] args) {
// ❌ Compilation error: неправильный тип
int x = "hello"; // Нельзя присвоить String к int
}
}
// Компилятор выдаст ошибку ДО выполнения программы
// ❌ Compilation error: неправильное использование оператора
int y = 5 +; // Неполное выражение
Runtime Error: Ошибки во время выполнения
Когда возникает: Во время выполнения программы, когда код уже скомпилирован
Причины:
- Деление на ноль
- Доступ к несуществующему индексу массива
- Попытка обращения к null/None
- Операции, которые компилятор не может предсказать
Примеры в Python:
# ❌ Runtime Error: ZeroDivisionError
x = 10
y = 0
result = x / y # Деление на ноль
# Программа скомпилируется, но упадёт при исполнении:
# ZeroDivisionError: division by zero
# ❌ Runtime Error: IndexError
list_data = [1, 2, 3]
value = list_data[10] # Индекс 10 не существует
# IndexError: list index out of range
# ❌ Runtime Error: AttributeError
data = None
data.process() # Не можно вызвать метод на None
# AttributeError: 'NoneType' object has no attribute 'process'
# ❌ Runtime Error: KeyError
dict_data = {'name': 'John'}
age = dict_data['age'] # Ключ не существует
# KeyError: 'age'
# ❌ Runtime Error: ValueError
value = int('abc') # Нельзя преобразовать строку в число
# ValueError: invalid literal for int() with base 10: 'abc'
Примеры в скомпилированных языках
// C++
#include <iostream>
using namespace std;
int main() {
// ❌ Runtime Error: доступ за границы массива
int arr[5] = {1, 2, 3, 4, 5};
int value = arr[100]; // Выходит за границы
// Программа скомпилируется, но может упасть при выполнении
// (в C++ это undefined behavior, может работать непредсказуемо)
// ❌ Runtime Error: деление на ноль
int x = 10;
int y = 0;
int result = x / y; // Деление на ноль
return 0;
}
Сравнение
| Параметр | Compilation Error | Runtime Error |
|---|---|---|
| Когда | До выполнения (компиляция) | Во время выполнения |
| Обнаружение | IDE, компилятор | Во время тестирования |
| Исправление | Надо исправить код | Надо обработать исключение |
| Пример | SyntaxError, TypeError | ZeroDivisionError, IndexError |
| Контроль | Компилятор/интерпретатор | Programmer должен обработать |
Практический пример
# Программа будет скомпилирована успешно
def process_data(data, divisor):
"""Процессирует данные"""
# ❌ Compilation error (Python) / Runtime error (другие)
# if data is None # Забыли : (Python выдаст SyntaxError)
#
# if data == None # OK с syntax, но Runtime error
if divisor == 0:
result = data / divisor # ❌ Runtime error: деление на ноль!
return result
else:
return data / divisor
# Вызовы
process_data(100, 5) # OK: 20
process_data(100, 0) # ❌ Runtime error: ZeroDivisionError
process_data(None, 5) # ❌ Runtime error: TypeError
Как обрабатывать Runtime Errors
1. Try-Except блоки:
def safe_divide(x, y):
try:
result = x / y
return result
except ZeroDivisionError:
print("Ошибка: деление на ноль!")
return None
except TypeError:
print("Ошибка: неверный тип данных")
return None
except Exception as e:
print(f"Неожиданная ошибка: {e}")
return None
print(safe_divide(10, 2)) # 5.0
print(safe_divide(10, 0)) # None + сообщение об ошибке
print(safe_divide(10, "a")) # None + сообщение об ошибке
2. Проверки перед выполнением:
def process_array(data, index):
# Проверка перед обращением
if not isinstance(data, list):
raise TypeError(f"Expected list, got {type(data)}")
if not isinstance(index, int):
raise TypeError(f"Index must be int, got {type(index)}")
if index < 0 or index >= len(data):
raise IndexError(f"Index {index} out of range [0, {len(data)-1}]")
return data[index]
# Безопасное использование
try:
value = process_array([1, 2, 3], 1) # OK: 2
value = process_array([1, 2, 3], 10) # ❌ Ловим IndexError
except IndexError as e:
print(f"Caught error: {e}")
3. Логирование ошибок:
import logging
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)
def risky_operation(data):
try:
return process(data)
except Exception as e:
logger.error(f"Operation failed: {e}", exc_info=True)
raise # Пробиваем ошибку выше
Data Science контекст
Compilation Errors при обработке данных:
# ❌ Компиляция/интерпретация ошибка
import pandas as pd
df = pd.read_csv('data.csv')
print(df['nonexistent_column']) # NameError или KeyError
# ❌ Type mismatch
numpy_array = df['values'].values
result = numpy_array + 'string' # TypeError
Runtime Errors при обучении моделей:
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
X = [[1, 2], [3, 4]]
y = [0, 1]
# ❌ Runtime error: недостаточно данных
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.9 # Слишком большой размер теста
)
# Может упасть: ValueError: not enough samples
# ❌ Runtime error: несоответствие размеров
model = RandomForestClassifier()
model.fit(X_train, y_train)
predictions = model.predict([[1, 2, 3]]) # Неверное число признаков!
# ValueError: X has 3 features but RandomForestClassifier is expecting 2
# ❌ Runtime error: деление на ноль
import numpy as np
accuracy = correct_predictions / total_samples # total_samples = 0!
# ZeroDivisionError: division by zero
Best Practices
1. Используй type hints (Python 3.5+):
def process_data(data: list, multiplier: int) -> float:
"""Type hints помогают IDE ловить ошибки раньше"""
return sum(data) * multiplier
2. Используй linters:
# Найти потенциальные runtime errors
flake8 script.py
pylint script.py
mypy script.py # Проверка типов
3. Тестирование:
import pytest
def test_divide_by_zero():
"""Тест покрывает Runtime error сценарий"""
with pytest.raises(ZeroDivisionError):
result = 10 / 0
def test_index_error():
"""Тест для IndexError"""
with pytest.raises(IndexError):
data = [1, 2, 3]
value = data[10]
Заключение
Compilation Errors:
- Ловятся статическим анализатором / компилятором
- Требуют исправления кода
- Можно предотвратить type hints и linters
Runtime Errors:
- Ловятся только при выполнении
- Требуют обработки try-except
- Найти помогают тесты и логирование
Для надёжного кода надо предотвращать оба типа ошибок!