JSFiddle - React, Tailwind, and code Playground
by amitrdx
HTML
<ul>
<li><a href="getPropertyData(null);">execute getPropertyData(null) method.</a>
</li>
<li><a href="testCapturedError();">execute testCapturedError() method.</a>
</li>
</ul>
<button onclick="getPropertyData(null)">Click 1</button>
<button onclick="testCapturedError(null)">Click 2</button>
JavaScript
function getPropertyData(value) {
var x = value.property.data;
}
function testCapturedError() {
var x = getPropertyDataCaptured(null);
}
function getPropertyDataCaptured(value) {
try {
var x = value.property.data;
} catch (err) {
if (arguments !== null && arguments.callee !== null && arguments.callee.trace)
//logError(err, arguments.callee.trace());
console.log(arguments.callee.trace());
}
}
function logError(ex, stack) {
if (ex === null) return;
if (logErrorUrl === null) {
alert('logErrorUrl must be defined.');
return;
}
var url = ex.fileName !== null ? ex.fileName : document.location;
if (stack === null && ex.stack !== null) stack = ex.stack;
// format output
var out = ex.message !== null ? ex.name + ": " + ex.message : ex;
out += ": at document path '" + url + "'.";
if (stack !== null) out += "\n at " + stack.join("\n at ");
// send error message
$.ajax({
type: 'POST',
url: logErrorUrl,
data: {
message: out
}
});
}
Function.prototype.trace = function () {
var trace = [];
var current = this;
while (current) {
trace.push(current.signature());
current = current.caller;
}
return trace;
};
Function.prototype.signature = function () {
var signature = {
name: this.getName(),
params: [],
toString: function () {
var params = this.params.length > 0 ?
"'" + this.params.join("', '") + "'" : "";
return this.name + "(" + params + ")";
}
};
if (this.arguments) {
for (var x = 0; x < this.arguments.length; x++)
signature.params.push(this.arguments[x]);
}
return signature;
};
Function.prototype.getName = function () {
if (this.name) return this.name;
var definition = this.toString().split("\n")[0];
var exp = /^function ([^\s(]+).+/;
if...