Строка --- End of stack trace from previous location where exception was thrown --- (в русской локализации — «конец трассировки стека из предыдущего расположения, где возникло исключение») появляется в тексте исключения .NET-приложения и не является отдельной ошибкой: это разделитель, который среда выполнения вставляет в StackTrace, когда исключение перебрасывается через границы асинхронных вызовов или повторно генерируется через throw;. Именно поэтому многие разработчики и системные администраторы, впервые увидев её в логе или в окне ошибки, принимают её за саму проблему, хотя реальная причина находится выше или ниже этой строки в тексте исключения.

Разберёмся, откуда берётся эта надпись, почему она затрудняет чтение стека, как правильно анализировать такие исключения в приложениях на C# и что делать, если вы просто пользователь программы, а не её разработчик.

Что означает эта строка на самом деле

Когда в .NET возникает исключение, в объект Exception записывается стек вызовов — цепочка методов, через которые прошло выполнение до точки сбоя. Если исключение «путешествует» через асинхронный код (async/await), задачи Task или повторно выбрасывается, среда выполнения дополняет стек и вставляет маркер-разделитель, чтобы показать: дальше идёт стек предыдущего места, где это же исключение уже было выброшено.

Иными словами, строка говорит: «всё, что ниже, — это история исключения до того, как оно попало в текущую точку». Сама по себе она не содержит диагностики и не указывает ни на какой сбойный компонент. Важно понимать, что искать причину нужно в типе исключения, его сообщении (Message) и кадрах стека вокруг разделителя, а не в самой строке-разделителе.

💡

Строка «конец трассировки стека…» — это не ошибка, а разделитель внутри стека исключения. Реальная причина указана в типе исключения и сообщении выше неё.