qiprofile
Version:
Quantitative Imaging Profile ( QiPr) web application
91 lines (90 loc) • 4.2 kB
text/coffeescript
define ['angular', 'stacktrace'], (ng, stacktrace) ->
Print the full error message in an alert box. This is a work-around
for Chrome bug 331971
(cf. https://code.google.com/p/chromium/issues/detail?id=331971)
which truncates long error messages. This code is copied from
http://stackoverflow.com/a/22218280/674326.
# TODO - The handler breaks with error:
sourceMappingURL not found
Uncomment, induce an error and fix. See following TODO and FIXME items.
# window.onerror = (errorMsg, url, lineNumber, columnNumber, errorObject) ->
# Check the errorObject as IE and FF don't pass it through (yet).
if errorObject?
errMsg = errorObject.message
else
errMsg = errorMsg
alert('Error: ' + errMsg)
# # The error handler module.
#
# Note: testing this module is prohibitively difficult. Suggestions for
# disabling the Mocha error trap don't work. ngMockE2E could be used to
# build a pseudo-app and HTML test harness, but that is not worth the
# trouble. The work-around to test this module is to introduce an error
# in the qiprofile code and check that it is logged on the server.
error = ng.module 'qiprofile.error', []
# # Augment the Angular exception handler to print an error on both
# the console (the default behavior) and the server.
error.factory '$exceptionHandler', ['$log', '$window', ($log, $window) ->
(exception, cause) ->
# Print the error on the console.
$log.error.apply($log, arguments)
# Send the error to the server.
# TODO - given the FIXMEs below, revisit this module, look for good
# usage examples and either fix or kill it.
try
message = "#{ exception }"
# FIXME - stacktrace.fromError returns an empty string in
# E2E Session Detail testing when the download.isDisplayed
# function is not found, with the following message:
# Client error: TypeError: download.isDisplayed is not a function.
# Don't know if that is always the case.
# TODO - Induce an error by replacing download.isDisplayed with
# download.fooBar and isolate the problem.
#
# FIXME - after the AngularJS 1.4.9 upgrade, an error fetching
# a REST object results in a JSON parser error which in turn
# causes a secondary stackTrace.fromError error with the following
# message:
# TypeError('Given line number must be a positive integer')
# deep in the obscure stackTrace code. Work-around is to pass
# over the stack trace and handle the failed failure handler
# gracefully.
try
stackTrace = stacktrace.fromError(exception)
catch TypeError
stackTrace = null
# The object to send.
payload =
url: $window.location.href
name: exception.name
message: message
stackTrace: stackTrace
cause: cause or ''
# Send the object to the server.
# Note: can't use the File service, since File depends on
# $exceptionHandler.
xhr = new window.XMLHttpRequest()
xhr.open('POST', '/error', true)
xhr.setRequestHeader('Content-type', 'application/json')
# The XHR request is retransmitted several times.
# Consequently, the error is logged multiple times on the server.
# Prevent this by throttling the send back to once per second
# (which usually means only once).
#
# FIXME - the lodash throttle below has no effect. Why not?
# send = -> xhr.send(ng.toJson(payload))
# throttled = _.throttle(send, 1000)
# throttled()
# TODO - fix above to replace below and remove the guard in the
# server.coffee /error handler.
xhr.send(ng.toJson(payload))
catch loggingError
# Can't send the error to the server;
# Log to the client only.
$log.warn 'Error logging failed'
$log.log loggingError
]