← Назад к вопросам

В чем разница между 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 ErrorRuntime Error
КогдаДо выполнения (компиляция)Во время выполнения
ОбнаружениеIDE, компиляторВо время тестирования
ИсправлениеНадо исправить кодНадо обработать исключение
ПримерSyntaxError, TypeErrorZeroDivisionError, 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
  • Найти помогают тесты и логирование

Для надёжного кода надо предотвращать оба типа ошибок!

В чем разница между Runtime error и Compilation error? | PrepBro