Index: pkg/analysis_server/lib/src/analysis_server.dart |
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart |
index fa718fccb2b69a3414156bfefcddec26274259f5..546859f79381a13a9be471321679340aa3c4446a 100644 |
--- a/pkg/analysis_server/lib/src/analysis_server.dart |
+++ b/pkg/analysis_server/lib/src/analysis_server.dart |
@@ -13,6 +13,7 @@ import 'package:analysis_server/protocol/protocol_generated.dart' |
hide AnalysisOptions; |
import 'package:analysis_server/src/analysis_logger.dart'; |
import 'package:analysis_server/src/channel/channel.dart'; |
+import 'package:analysis_server/src/collections.dart'; |
import 'package:analysis_server/src/computer/computer_highlights.dart'; |
import 'package:analysis_server/src/computer/computer_highlights2.dart'; |
import 'package:analysis_server/src/computer/computer_outline.dart'; |
@@ -262,6 +263,12 @@ class AnalysisServer { |
} |
/** |
+ * A [RecentBuffer] of the most recent exceptions encountered by the analysis |
+ * server. |
+ */ |
+ final RecentBuffer<ServerException> exceptions = new RecentBuffer(10); |
+ |
+ /** |
* The class into which performance information is currently being recorded. |
* During startup, this will be the same as [performanceDuringStartup] |
* and after startup is complete, this switches to [performanceAfterStartup]. |
@@ -1233,26 +1240,26 @@ class AnalysisServer { |
void sendServerErrorNotification(String message, exception, stackTrace, |
{bool fatal: false}) { |
StringBuffer buffer = new StringBuffer(); |
- if (exception != null) { |
- buffer.write(exception); |
- } else { |
- buffer.write('null exception'); |
- } |
+ buffer.write(exception ?? 'null exception'); |
if (stackTrace != null) { |
buffer.writeln(); |
buffer.write(stackTrace); |
} else if (exception is! CaughtException) { |
- try { |
- throw 'ignored'; |
- } catch (ignored, stackTrace) { |
- buffer.writeln(); |
- buffer.write(stackTrace); |
- } |
+ stackTrace = StackTrace.current; |
Brian Wilkerson
2017/06/02 17:00:47
Or
buffer.writeln();
buffer.write(stackTrace ?? S
|
+ buffer.writeln(); |
+ buffer.write(stackTrace); |
} |
+ |
// send the notification |
channel.sendNotification( |
new ServerErrorParams(fatal, message, buffer.toString()) |
.toNotification()); |
+ |
+ // remember the last few exceptions |
+ if (exception is CaughtException) { |
+ stackTrace ??= exception.stackTrace; |
Brian Wilkerson
2017/06/02 17:00:47
stackTrace will never be null at this point (unles
devoncarew
2017/06/02 17:12:59
I think it can be, if it starts null, and the exce
Brian Wilkerson
2017/06/02 17:20:28
Yep. I missed the condition.
|
+ } |
+ exceptions.add(new ServerException(message, exception, stackTrace, fatal)); |
} |
/** |
@@ -2384,3 +2391,18 @@ class ServerPerformanceStatistics { |
*/ |
static PerformanceTag splitStore = new PerformanceTag('splitStore'); |
} |
+ |
+/** |
+ * Used to record server exceptions. |
+ */ |
+class ServerException { |
+ final String message; |
+ final dynamic exception; |
+ final StackTrace stackTrace; |
+ final bool fatal; |
+ |
+ ServerException(this.message, this.exception, this.stackTrace, this.fatal); |
+ |
+ @override |
+ String toString() => message; |
+} |