package de.take_weiland.mods.commons.crash; import de.take_weiland.mods.commons.util.JavaUtils; import net.minecraft.crash.CrashReportCategory; import java.util.concurrent.Callable; /** * <p>Helper class for working with CrashReports.</p> * @author diesieben07 */ public final class Crashing { /** * <p>Apply an {@code UncaughtExceptionHandler} to the given Thread, which will cause any uncaught Exceptions from * the Thread to cause a CrashReport in the main Minecraft Thread.</p> * @param thread the Thread * @return the same Thread that was passed in, for convenience */ public static <T extends Thread> T applyExceptionHandler(T thread) { thread.setUncaughtExceptionHandler(CrashExceptionHandler.INSTANCE); return thread; } /** * <p>Append the given Objects to the category with the given name. If the array contains a single {@code Callable} * it will be called for the actual value. Any Exception thrown during that process will be appended instead. * Otherwise the value will be converted to a String representation using * {@link de.take_weiland.mods.commons.util.JavaUtils#toString(Object)}.</p> * @param category the category * @param name the name for the value * @param value the value */ public static void addSection(CrashReportCategory category, String name, final Object... value) { if (value.length == 1) { Object single = value[0]; if (single instanceof Callable) { try { addSection(category, name, ((Callable<?>) single).call()); } catch (Throwable t) { category.addCrashSectionThrowable(name, t); } } else { category.addCrashSection(name, JavaUtils.toString(single)); } } else { category.addCrashSection(name, JavaUtils.toString(value)); } } private Crashing() { } }