[TxMt] tiny improvements for perlmate.rb
Hans-Joerg Bibiko
bibiko at eva.mpg.de
Mon Dec 4 10:32:00 UTC 2006
Hi Alex,
after 'sleeping' the whole weekend about that here my suggestion:
#######################
- if you write
BEGIN {
*CORE::GLOBAL::die = \&__PACKAGE__::die;
}
then we run into problems if the 'die' is called from inside a
package, because you get the error message unknown subroutine for
'__PACKAGE__::die'
That's why I tried:
BEGIN {
$SIG{__DIE__} = \¨
########################
- we also have to catch a 'warn' statement within an 'eval block'
That's why include the subroutine warn. Otherwise you get an error
message for an unknown routine.
########################
- I change the id subroutine to get really the line which emitted the
exception.
Example:
#!/usr/bin/perl -w
use Foundation;
$f= NSString->foo("H");
will write something like this:
**** ERROR **** PerlObjCBridge: sendObjcMessage: Can't get
NSMethodSignature for message "foo"
**** ERROR **** PerlObjCBridge: error sending message foo at /System/
Library/Perl/Extras/5.8.6/darwin-thread-multi-2level/
PerlObjCBridge.pm line 230.
But here I don't know which line of my script emitted this error.
After my changes at the subroutine id now I get:
**** ERROR **** PerlObjCBridge: sendObjcMessage: Can't get
NSMethodSignature for message "foo"
**** ERROR **** PerlObjCBridge: error sending message foo at /System/
Library/Perl/Extras/5.8.6/darwin-thread-multi-2level/
PerlObjCBridge.pm line 230.
in untitled.pl at line 5
What I'm done here is to call 'caller' as long as the return is
defined; go one level back and ask whether the exception/warn was
called from inside of an eval block.
########################
- if 'die' is called from inside of 'eval' the handler writes the
message and the script is running further
exit($!) if (!$^S);
########################
- to output the real content of $message I wrote a tiny htmlize
subroutine
########################
- to avoid redundancy I wrote two tiny subroutines for file name
checking and printing
########################
- to avoid an error on a closed file handle if warn and die occur
within an eval block I specified
BEGIN {
$SIG{__DIE__} = \¨
my $error_fd = $ENV{"TM_ERROR_FD"};
open (TM_ERROR_FD, ">&=$error_fd");
}
END {
print TM_ERROR_FD "</div>";
close (TM_ERROR_FD);
}
########################
I tested it several times and it seems that it works. Comments?
All the best,
Hans
-------------- next part --------------
A non-text attachment was scrubbed...
Name: exception_handler.pm
Type: text/x-perl-script
Size: 2077 bytes
Desc: not available
URL: <http://lists.macromates.com/textmate/attachments/20061204/62713794/attachment.pm>
More information about the textmate
mailing list