Класс StackTrace
Класс StackTrace используется для представления
трассировки стека - последовательности вызовов
функций и методов, которая привела к текущему
моменту выполнения программы. Чаще всего объект
этого класса создается автоматически при
возникновении исключения и передается в блок
catch вторым параметром. Класс не имеет
публичного конструктора для прямого создания,
однако содержит статическое свойство
current, возвращающее текущую трассировку.
Метод toString преобразует трассировку
в читаемую строку.
Синтаксис
StackTrace.current
stackTrace.toString()
Пример
Давайте получим текущую трассировку стека
с помощью свойства current и выведем
ее первый фрагмент:
void main()
{
StackTrace stackTrace = StackTrace.current;
print(stackTrace.toString().split('\n').first);
}
Результат выполнения кода (путь и номер строки могут отличаться):
"#0 main (file:///path/to/main.dart:3:28)"
Пример
Давайте перехватим исключение и выведем
его трассировку стека в блоке catch:
void main()
{
try
{
throw Exception('Something went wrong');
}
catch (e, stackTrace)
{
print('Error: $e');
print('Stack trace:');
print(stackTrace);
}
}
Результат выполнения кода (адреса и номера строк могут отличаться):
"Error: Exception: Something went wrong"
"Stack trace:"
"#0 main (file:///path/to/main.dart:5:11)"
"#1 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)"
"#2 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)"
Пример
Давайте разобьем трассировку на отдельные строки и выведем только те, что относятся к нашему коду:
void main()
{
try
{
throw StateError('Invalid state');
}
catch (e, stackTrace)
{
List<String> frames = stackTrace.toString().split('\n');
for (String frame in frames)
{
if (frame.contains('main.dart'))
{
print(frame);
}
}
}
}
Результат выполнения кода (номер строки может отличаться):
"#0 main (file:///path/to/main.dart:5:11)"