The stage of product support takes a lot of energy and nerves. The path from “I press and it does not work” to solve the problem, even with a first-class telepath, can take a lot of time. The time during which the client / boss will be angry and unhappy.app.Error = function Error(error,lastFn){ if(error && error.name && error.message && error.stack){ , this.name=error.name; this.message=error.message; this.stack=error.stack; this.clueData=error.clueData||[]; this._alarmLvl=error._alarmLvl||'trivial'; this._side=error._side || (module ? "backend" : "frontend");// return; } if(!app.isString(error)) error='unknown error'; this.name='Error'; this.message=error; this._alarmLvl='trivial'; this._side=module ? "backend" : "frontend"; this.clueData=[]; if (Error.captureStackTrace) { Error.captureStackTrace(this, app.isFunction(lastFn)? lastFn : this.constructor); } else { this.stack = (new Error()).stack.split('\n').removeAt(1).join();// } }; app.Error.prototype = Object.create(Error.prototype); app.Error.prototype.constructor = app.Error; app.Error.prototype.setFatal = function () {//getter/setters this._alarmLvl='fatal'; return this; }; app.Error.prototype.setTrivial = function () { this._alarmLvl='trivial'; return this; }; app.Error.prototype.setWarning = function () { this._alarmLvl='warning'; return this; }; app.Error.prototype.getAlarmLevel = function () { return this._alarmLvl; }; app.Error.prototype.addClueData = function(name,data){// var dataObj={}; dataObj[name]=data; this.clueData.push(dataObj); return this; }; socket.on(fullName, function (values) { <...> method(values)// api .then(<...>) .catch(function (error) {// throw new app.Error(error)// .setFatal()// " " .addClueData('api', {// fullName, values, handshake: socket.handshake }) }); }); app.errorForSending=[]; app.sendError = function (error) {// app.io.emit('server error send', new app.Error(error)); }; window.onerror = function (message, source, lineno, colno, error) {// app.errorForSending.push(// . new app.Error(error) .setFatal());// , }; app.events.on('socket.io ready', ()=> {// window.onerror = function (message, source, lineno, colno, error) {// app.sendError(new app.Error(error).setFatal()); }; app.errorForSending.forEach((error)=> {// , app.sendError(error); }); delete app.errorForSending; }); app.events.on('client ready', ()=> {// window.onerror = function (message, source, lineno, colno, error) { app.sendError(error); }; }); function wrapConsole(name, action) { console['$' + name] = console[name];// console[name] = function () { console['$' + name](...arguments);// app.sendError( new app.Error(`From console.${name}: ` + [].join.call(arguments, '' ),// console[name])// ( v8) .addClueData('console', {// consoleMethod: name, arg : Array.create(arguments) })[action]());// }; } wrapConsole('error', 'setTrivial'); wrapConsole('warn', 'setWarning'); wrapConsole('info', 'setWarning'); Source: https://habr.com/ru/post/307482/
All Articles