Avoid server stacktraces on close

On close, the socket is closed by the client, and the server process is
killed.

This leads to (expected) exceptions, that should not be printed.
This commit is contained in:
Romain Vimont 2018-02-09 10:59:15 +01:00
parent 2fdc368c41
commit c683872bbc

View file

@ -1,6 +1,7 @@
package com.genymobile.scrcpy; package com.genymobile.scrcpy;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
public final class ScrCpyServer { public final class ScrCpyServer {
@ -20,7 +21,7 @@ public final class ScrCpyServer {
// synchronous // synchronous
screenEncoder.streamScreen(device, connection.getOutputStream()); screenEncoder.streamScreen(device, connection.getOutputStream());
} catch (IOException e) { } catch (IOException e) {
Ln.e("Screen streaming interrupted", e); Ln.w("Screen streaming stopped");
} }
} }
} }
@ -32,7 +33,7 @@ public final class ScrCpyServer {
try { try {
new EventController(device, connection).control(); new EventController(device, connection).control();
} catch (IOException e) { } catch (IOException e) {
Ln.e("Exception from event controller", e); Ln.w("Event controller stopped");
} }
} }
}).start(); }).start();
@ -60,6 +61,13 @@ public final class ScrCpyServer {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override @Override
public void uncaughtException(Thread t, Throwable e) { public void uncaughtException(Thread t, Throwable e) {
if (e instanceof AssertionError && e.getCause() instanceof InvocationTargetException) {
// WORKAROUND
// When we call a method of the framework by reflection, it may throw an InvocationTargetException
// (that we wrap into an AssertionError) if this process is being killed.
// To avoid the stacktrace on close, do not log these errors.
return;
}
Ln.e("Exception on thread " + t, e); Ln.e("Exception on thread " + t, e);
} }
}); });