| | public class AppHelper {
static string shortfilename(string fn) { return fn==null ? "" : Path.GetFileName(fn).ToLower(); }
static public void log(string fmt, params object[] args) {
Console.WriteLine(fmt, args);
}
static public Func<Exception, string, bool> hook_filter = null;
static public Action<Exception, string> hook_rethrow = null;
static string get_location(Exception e) {
string loc = "";
var st = new StackTrace(e, true);
if (st.FrameCount > 0) {
var f = st.GetFrame(0);
var m = f.GetMethod();
loc = String.Format("{0}:{1}:{2} {3}.{4}",
shortfilename(f.GetFileName()), f.GetFileLineNumber(), f.GetFileColumnNumber(),
m.ReflectedType.FullName, m.Name
);
}
return loc;
}
static public void exception(Exception e, string reference) {
bool skip = false;
var filter = hook_filter;
if (filter != null) skip = filter(e, reference);
if (skip) return;
var st = new StackTrace(true);
log("{0}(#{1}): {2}", e.GetType(), reference, e.Message);
string tab="";
for (var ce = e.InnerException;ce != null;ce = ce.InnerException) {
tab = tab + " ";
log("{0}{1}({2}): {3}", tab, ce.GetType(),get_location(ce), ce.Message);
}
for (int i = 1;i < st.FrameCount;i++) {
var f = st.GetFrame(i);
var m = f.GetMethod();
log("\t{0}:{1}:{2} {3}.{4}",
shortfilename(f.GetFileName()), f.GetFileLineNumber(), f.GetFileColumnNumber(),
m.ReflectedType.FullName, m.Name);
}
var rethrow = hook_rethrow;
if (rethrow != null) rethrow(e, reference);
}
}
|