diff --git a/lib/src/common_server_impl.dart b/lib/src/common_server_impl.dart
index 5f13521..7a4d555 100644
--- a/lib/src/common_server_impl.dart
+++ b/lib/src/common_server_impl.dart
@@ -195,7 +195,7 @@
       throw BadRequest('Missing parameter: \'source\'');
     }
 
-    return _format(request.source, offset: request.offset ?? 0);
+    return _format(request.source, request.offset ?? 0);
   }
 
   Future<proto.DocumentResponse> document(proto.SourceRequest request) {
@@ -224,7 +224,7 @@
       log.info('PERF: Analyzed $lineCount lines of Dart in ${ms}ms.');
       return results;
     } catch (e, st) {
-      log.severe('Error during analyze', e, st);
+      log.severe('Error during _analyze on "$source"', e, st);
       await restart();
       rethrow;
     }
@@ -234,30 +234,31 @@
     String source, {
     bool returnSourceMap = false,
   }) async {
-    await _checkPackageReferencesInitFlutterWeb(source);
+    try {
+      await _checkPackageReferencesInitFlutterWeb(source);
 
-    final sourceHash = _hashSource(source);
-    final memCacheKey = '%%COMPILE:v0'
-        ':returnSourceMap:$returnSourceMap:source:$sourceHash';
+      final sourceHash = _hashSource(source);
+      final memCacheKey = '%%COMPILE:v0'
+          ':returnSourceMap:$returnSourceMap:source:$sourceHash';
 
-    final result = await checkCache(memCacheKey);
-    if (result != null) {
-      log.info('CACHE: Cache hit for compileDart2js');
-      final resultObj = const JsonDecoder().convert(result);
-      final response = proto.CompileResponse()
-        ..result = resultObj['compiledJS'] as String;
-      if (resultObj['sourceMap'] != null) {
-        response.sourceMap = resultObj['sourceMap'] as String;
+      final result = await checkCache(memCacheKey);
+      if (result != null) {
+        log.info('CACHE: Cache hit for compileDart2js');
+        final resultObj = const JsonDecoder().convert(result);
+        final response = proto.CompileResponse()
+          ..result = resultObj['compiledJS'] as String;
+        if (resultObj['sourceMap'] != null) {
+          response.sourceMap = resultObj['sourceMap'] as String;
+        }
+        return response;
       }
-      return response;
-    }
 
-    log.info('CACHE: MISS for compileDart2js');
-    final watch = Stopwatch()..start();
+      log.info('CACHE: MISS for compileDart2js');
+      final watch = Stopwatch()..start();
 
-    return compiler
-        .compile(source, returnSourceMap: returnSourceMap)
-        .then((CompilationResults results) {
+      final results =
+          await compiler.compile(source, returnSourceMap: returnSourceMap);
+
       if (results.hasOutput) {
         final lineCount = source.split('\n').length;
         final outputSize = (results.compiledJS.length / 1024).ceil();
@@ -283,33 +284,35 @@
         final errors = problems.map(_printCompileProblem).join('\n');
         throw BadRequest(errors);
       }
-    }).catchError((dynamic e, dynamic st) {
+    } catch (e, st) {
       if (e is! BadRequest) {
-        log.severe('Error during compile (dart2js): $e\n$st');
+        log.severe('Error during compile (dart2js) on "$source"', e, st);
       }
-      throw e;
-    });
+      rethrow;
+    }
   }
 
   Future<proto.CompileDDCResponse> _compileDDC(String source) async {
-    await _checkPackageReferencesInitFlutterWeb(source);
+    try {
+      await _checkPackageReferencesInitFlutterWeb(source);
 
-    final sourceHash = _hashSource(source);
-    final memCacheKey = '%%COMPILE_DDC:v0:source:$sourceHash';
+      final sourceHash = _hashSource(source);
+      final memCacheKey = '%%COMPILE_DDC:v0:source:$sourceHash';
 
-    final result = await checkCache(memCacheKey);
-    if (result != null) {
-      log.info('CACHE: Cache hit for compileDDC');
-      final resultObj = const JsonDecoder().convert(result);
-      return proto.CompileDDCResponse()
-        ..result = resultObj['compiledJS'] as String
-        ..modulesBaseUrl = resultObj['modulesBaseUrl'] as String;
-    }
+      final result = await checkCache(memCacheKey);
+      if (result != null) {
+        log.info('CACHE: Cache hit for compileDDC');
+        final resultObj = const JsonDecoder().convert(result);
+        return proto.CompileDDCResponse()
+          ..result = resultObj['compiledJS'] as String
+          ..modulesBaseUrl = resultObj['modulesBaseUrl'] as String;
+      }
 
-    log.info('CACHE: MISS for compileDDC');
-    final watch = Stopwatch()..start();
+      log.info('CACHE: MISS for compileDDC');
+      final watch = Stopwatch()..start();
 
-    return compiler.compileDDC(source).then((DDCCompilationResults results) {
+      final results = await compiler.compileDDC(source);
+
       if (results.hasOutput) {
         final lineCount = source.split('\n').length;
         final outputSize = (results.compiledJS.length / 1024).ceil();
@@ -331,12 +334,12 @@
         final errors = problems.map(_printCompileProblem).join('\n');
         throw BadRequest(errors);
       }
-    }).catchError((dynamic e, dynamic st) {
+    } catch (e, st) {
       if (e is! BadRequest) {
-        log.severe('Error during compile (DDC): $e\n$st');
+        log.severe('Error during compile (DDC) on "$source"', e, st);
       }
-      throw e;
-    });
+      rethrow;
+    }
   }
 
   Future<proto.DocumentResponse> _document(String source, int offset) async {
@@ -350,7 +353,7 @@
       log.info('PERF: Computed dartdoc in ${watch.elapsedMilliseconds}ms.');
       return proto.DocumentResponse()..info.addAll(docInfo);
     } catch (e, st) {
-      log.severe('Error during dartdoc', e, st);
+      log.severe('Error during _document on "$source" at $offset', e, st);
       await restart();
       rethrow;
     }
@@ -376,39 +379,57 @@
       log.info('PERF: Computed completions in ${watch.elapsedMilliseconds}ms.');
       return response;
     } catch (e, st) {
-      log.severe('Error during _complete', e, st);
+      log.severe('Error during _complete on "$source" at $offset', e, st);
       await restart();
       rethrow;
     }
   }
 
   Future<proto.FixesResponse> _fixes(String source, int offset) async {
-    await _checkPackageReferencesInitFlutterWeb(source);
+    try {
+      await _checkPackageReferencesInitFlutterWeb(source);
 
-    final watch = Stopwatch()..start();
-    final response =
-        await getCorrectAnalysisServer(source).getFixes(source, offset);
-    log.info('PERF: Computed fixes in ${watch.elapsedMilliseconds}ms.');
-    return response;
+      final watch = Stopwatch()..start();
+      final response =
+          await getCorrectAnalysisServer(source).getFixes(source, offset);
+      log.info('PERF: Computed fixes in ${watch.elapsedMilliseconds}ms.');
+      return response;
+    } catch (e, st) {
+      log.severe('Error during _fixes on "$source" at $offset', e, st);
+      await restart();
+      rethrow;
+    }
   }
 
   Future<proto.AssistsResponse> _assists(String source, int offset) async {
-    await _checkPackageReferencesInitFlutterWeb(source);
+    try {
+      await _checkPackageReferencesInitFlutterWeb(source);
 
-    final watch = Stopwatch()..start();
-    final response =
-        await getCorrectAnalysisServer(source).getAssists(source, offset);
-    log.info('PERF: Computed assists in ${watch.elapsedMilliseconds}ms.');
-    return response;
+      final watch = Stopwatch()..start();
+      final response =
+          await getCorrectAnalysisServer(source).getAssists(source, offset);
+      log.info('PERF: Computed assists in ${watch.elapsedMilliseconds}ms.');
+      return response;
+    } catch (e, st) {
+      log.severe('Error during _assists on "$source" at $offset', e, st);
+      await restart();
+      rethrow;
+    }
   }
 
-  Future<proto.FormatResponse> _format(String source, {int offset}) async {
-    final watch = Stopwatch()..start();
+  Future<proto.FormatResponse> _format(String source, int offset) async {
+    try {
+      final watch = Stopwatch()..start();
 
-    final response =
-        await getCorrectAnalysisServer(source).format(source, offset);
-    log.info('PERF: Computed format in ${watch.elapsedMilliseconds}ms.');
-    return response;
+      final response =
+          await getCorrectAnalysisServer(source).format(source, offset);
+      log.info('PERF: Computed format in ${watch.elapsedMilliseconds}ms.');
+      return response;
+    } catch (e, st) {
+      log.severe('Error during _format on "$source" at $offset', e, st);
+      await restart();
+      rethrow;
+    }
   }
 
   Future<String> checkCache(String query) => cache.get(query);
