Я пытаюсь создать инструмент для автоматического сообщения об ошибках для нашего настольного Java-приложения.Идея состоит в том, чтобы максимально упростить для клиентов отправку нам отчетов об ошибках в случае сбоя нашего приложения.
Используя API Desktop.mail, я могу создавать сообщения, которые можно легко редактировать и отправлять с нашегопользователи, но я сталкиваюсь с системными ограничениями на нескольких платформах (в частности, Windows 7 и MS Outlook, которые используют большинство клиентов)
Когда я запускаю приведенный ниже пример кода, вы заметите, что сообщение электронной почты, котороеотображается обрезает включенную трассировку стека.Я считаю, что это как-то связано с максимальной длиной командных строк или URI в базовых системах.
Есть ли лучший способ создать письмо из сообщения об ошибке, которое не подпадает под это ограничение?
import java.awt.Desktop;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
import java.net.URLEncoder;
public class Scratchpad {
public static void main(String[] args) throws Exception {
try {
generateLongStackTrace();
} catch (Error e) {
URI uri = createMailURI(e);
// this will correctly pop up the system email client, but it will truncate the message
// after about 2K of data (this seems system dependent)
Desktop.getDesktop().mail(uri);
}
}
// Will eventually generate a really long stack overflow error
public static void generateLongStackTrace() throws Exception {
generateLongStackTrace();
}
public static URI createMailURI(Error e) throws Exception {
StringBuilder builder = new StringBuilder();
builder.append("mailto:foo@example.com?body=");
// encodes the stack trace in a mailto URI friendly form
String encodedStackTrace = URLEncoder.encode(dumpToString(e), "utf-8").replace("+", "%20");
builder.append(encodedStackTrace);
return new URI(builder.toString());
}
// Dumps the offending stack trace into a string object.
public static String dumpToString(Error e) {
StringWriter sWriter = new StringWriter();
PrintWriter writer = new PrintWriter(sWriter);
e.printStackTrace(writer);
writer.flush();
return sWriter.toString();
}
}