Parece que estou meio atrasado :), mas a discussão é bem interessante, então ... aqui vai ... Supondo que você queira construir um manipulador de erros e esteja usando sua própria classe de manipulador de exceções como:
function errorHandler(error){
this.errorMessage = error;
}
errorHandler.prototype. displayErrors = function(){
throw new Error(this.errorMessage);
}
E você está agrupando seu código assim:
try{
if(condition){
//whatever...
}else{
throw new errorHandler('Some Error Message');
}
}catch(e){
e.displayErrors();
}
Muito provavelmente, você terá o manipulador de erros em um arquivo .js separado.
Você notará que no console de erro do firefox ou do Chrome o número da linha de código (e nome do arquivo) mostrado é a linha (arquivo) que lança a exceção 'Error' e não a exceção 'errorHandler' que você realmente deseja para fazer a depuração fácil. É ótimo lançar suas próprias exceções, mas em grandes projetos, localizá-las pode ser um problema, especialmente se elas tiverem mensagens semelhantes. Então, o que você pode fazer é passar uma referência a um objeto Error vazio real para o seu manipulador de erros, e essa referência conterá todas as informações que você deseja (por exemplo, no firefox você pode obter o nome do arquivo e o número da linha etc. ; no cromo, você obtém algo semelhante se ler a propriedade 'stack' da instância Error). Resumindo, você pode fazer algo assim:
function errorHandler(error, errorInstance){
this.errorMessage = error;
this. errorInstance = errorInstance;
}
errorHandler.prototype. displayErrors = function(){
//add the empty error trace to your message
this.errorMessage += ' stack trace: '+ this. errorInstance.stack;
throw new Error(this.errorMessage);
}
try{
if(condition){
//whatever...
}else{
throw new errorHandler('Some Error Message', new Error());
}
}catch(e){
e.displayErrors();
}
Agora você pode obter o arquivo real e o número da linha que gerou a exceção personalizada.