Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Runtime error?
Runtime error — это ошибка, которая происходит во время выполнения программы, а не во время компиляции или синтаксического анализа.
Определение
Runtime error — это исключение (exception), которое возникает, когда программа работает и возникает непредвиденная ситуация, которую код не может обработать.
Основные типы Runtime Errors в Python
1. ZeroDivisionError (Деление на ноль)
result = 10 / 0 # ZeroDivisionError: division by zero
try:
result = 10 / 0
except ZeroDivisionError:
result = float('inf')
2. IndexError (Обращение к несуществующему индексу)
my_list = [1, 2, 3]
value = my_list[10] # IndexError: list index out of range
try:
value = my_list[10]
except IndexError:
value = None
3. KeyError (Несуществующий ключ в словаре)
data = {'name': 'John', 'age': 30}
value = data['email'] # KeyError: 'email'
try:
value = data['email']
except KeyError:
value = None
4. TypeError (Неправильный тип данных)
result = "hello" + 5 # TypeError
try:
result = "hello" + str(5)
except TypeError:
result = None
5. ValueError (Неправильное значение)
number = int("abc") # ValueError
try:
number = int("123")
except ValueError:
number = 0
6. AttributeError (Несуществующий атрибут)
class Person:
def __init__(self, name):
self.name = name
person = Person("John")
print(person.age) # AttributeError
# Обработка
age = getattr(person, 'age', None)
7. FileNotFoundError (Файл не найден)
try:
with open('nonexistent.txt', 'r') as f:
data = f.read()
except FileNotFoundError:
print("Файл не найден!")
8. MemoryError (Недостаточно памяти)
try:
huge_list = [0] * (10**10)
except MemoryError:
print("Недостаточно памяти!")
Runtime Errors в контексте Data Science
1. Работа с NumPy/Pandas
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([1, 2])
try:
result = arr1 + arr2 # ValueError: incompatible shapes
except ValueError as e:
print(f"Ошибка: {e}")
2. Работа с ML моделями
from sklearn.linear_model import LinearRegression
import numpy as np
X = np.array([[1, 2], [3, 4]])
y = np.array([1, 2, 3]) # Неверная размерность!
try:
model = LinearRegression()
model.fit(X, y) # ValueError
except ValueError as e:
print(f"Ошибка валидации: {e}")
Лучшие практики обработки Runtime Errors
1. Используйте try-except-finally
try:
result = 10 / int(user_input)
except ZeroDivisionError:
print("Деление на ноль!")
except ValueError:
print("Неверный ввод!")
except Exception as e:
print(f"Неизвестная ошибка: {e}")
finally:
print("Выполнено в любом случае")
2. Логирование ошибок
import logging
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)
try:
result = 10 / 0
except ZeroDivisionError as e:
logger.error(f"Произошла ошибка: {e}", exc_info=True)
3. Валидация входных данных
def process_data(data):
if not isinstance(data, list):
raise TypeError("data должен быть список")
if len(data) == 0:
raise ValueError("data не может быть пустым")
return sum(data) / len(data)
try:
result = process_data([1, 2, 3])
except (TypeError, ValueError) as e:
print(f"Ошибка валидации: {e}")
4. Используйте контекстные менеджеры
# Хорошая практика
try:
with open('file.txt', 'r') as f:
data = f.read()
except FileNotFoundError:
print("Файл не найден")
Как избежать Runtime Errors
1. Проверяйте границы
def get_element(lst, index, default=None):
if 0 <= index < len(lst):
return lst[index]
return default
2. Проверяйте None
value = get_optional_value()
result = value.upper() if value else None
3. Используйте type hints
from typing import List, Optional
def process(data: List[int]) -> Optional[int]:
if len(data) == 0:
return None
return sum(data) // len(data)
4. Тестируйте граничные случаи
import pytest
def test_divide():
assert divide(10, 2) == 5
with pytest.raises(ZeroDivisionError):
divide(10, 0)
Stack Trace (трассировка ошибок)
Когда происходит runtime error, Python выдаёт stack trace:
Traceback (most recent call last):
File "program.py", line 5, in <module>
result = 10 / 0
ZeroDivisionError: division by zero
Как читать:
- "File program.py" — файл с ошибкой
- "line 5" — номер строки
- "ZeroDivisionError" — тип ошибки
- "division by zero" — описание
Практический пример: обработка runtime errors в ML pipeline
import pandas as pd
from sklearn.linear_model import LinearRegression
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def ml_pipeline(data_path):
try:
logger.info(f"Загрузка данных из {data_path}")
df = pd.read_csv(data_path)
if df.empty:
raise ValueError("DataFrame пустой")
X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values
if X.shape[0] != y.shape[0]:
raise ValueError("Несовместимые размеры X и y")
logger.info("Обучение модели")
model = LinearRegression()
model.fit(X, y)
predictions = model.predict(X)
logger.info("Pipeline завершён успешно")
return model, predictions
except FileNotFoundError as e:
logger.error(f"Файл не найден: {e}")
return None, None
except ValueError as e:
logger.error(f"Ошибка валидации: {e}")
return None, None
except Exception as e:
logger.error(f"Неизвестная ошибка: {e}", exc_info=True)
return None, None
Ключевые выводы
-
Runtime error — это исключение, которое происходит во время выполнения программы
-
Основные типы: ZeroDivisionError, IndexError, KeyError, TypeError, ValueError, AttributeError, FileNotFoundError, MemoryError
-
Обработка: используйте try-except-finally
-
Валидация входных данных — лучший способ избежать runtime errors
-
Логирование помогает отладить проблемы в production
-
Type hints помогают поймать ошибки раньше
-
Stack trace показывает, где произошла ошибка и как до неё дошли
-
На практике: всегда обрабатывайте возможные ошибки и логируйте их для отладки