Error object dump - inline scripts

by James Greene

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/json2/20121008/json2.min.js"></script>
<div>
     <h4>Unthrown Error:</h4>
 <pre id="resultsUnthrown"></pre>

</div>
<div>
     <h4>Thrown Error:</h4>
 <pre id="resultsThrown"></pre>

</div>
<div>
     <h4>Error Event:</h4>
 <pre id="resultsEvent"></pre>

</div>
<div>
     <h4>`window.onerror`:</h4>
 <pre id="resultsOnError"></pre>

</div>

CSS

h1, h2, h3, h4, h5, h6, pre {
    margin: 0;
    padding: 0;
}
pre {
    font-size: 8pt;
    font-family: monospace;
}
div {
    margin-bottom: 15px;
}
}

JavaScript

var allErrorProps = ["name", "message", "fileName", "lineNumber", "columnNumber", "stack", "description", "number", "line", "source", "sourceId", "sourceURL", "file", "filename", "url", "URL", "stackArray", "column", "lineNo", "lineno", "colNo", "colno", "lineNum", "colNum", "columnNum", "col", "char", "code", "time", "date", "timestamp", "timeStamp", "detail", "details", "location", "href"];

function getEnumerableDataProps(obj) {
    var props = [];
    for (var prop in obj) {
        if (obj[prop] != null && typeof obj[prop] !== "function" && !/[A-Z]+(?:_[A-Z]+)*/.test(prop)) {
            props.push(prop);
        }
    }
    return props;
}

function forEach(arr, fn) {
    for (var i = 0, len = arr.length; i < len; i++) {
        fn(arr[i], i, arr);
    }
}

function getOnErrorDetails(message, fileName, lineNumber, columnNumber, error) {
    var details = {
        _name: message.indexOf(":") !== -1 ? message.replace(/^(Uncaught )?([^:]+):[\s\t\r\n]+.+$/, "$2") : "",
        _message: message.replace(/^([^:]+):[\s\t\r\n]+(.+)$/, "$2"),
        _rawMessage: message,
        _fileName: fileName,
        _lineNumber: lineNumber,
        _columnNumber: columnNumber != null ? columnNumber : "{{undefined}}",
        _errorDetails: error != null ? getErrorDetails(error) : "{{undefined}}"
    }
    return details;
}

function getErrorEventDetails(obj) {
    var details = getErrorDetails(obj);
    if (details && obj) {
        details.error = getErrorDetails(obj.error);
    }
    return details;
};

function getErrorDetails(obj) {
    if (obj == null) {
        return "{{undefined}}";
    }
    var details = {};
    forEach(allErrorProps, function (e) {
        if (e in obj) {
            if (typeof obj[e] === "undefined") {
                details[e] = "{{undefined}}";
            } else {
                details[e] = obj[e];
            }
        }
    });
    details._toStringStr = obj.toString();
    var rawStr = "" + obj;
    if (rawStr !== details._toStringStr)...