Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
tezro 26.05.2009 19:14 / 26.05.2009 19:20
В общем, как-то так.############################################################################### # Custom exceptions handling, version 0.1 ############################################################################### @CLASS CustomException ############################################################################### @auto[] $response:content-type[ $.value[text/html] $.charset[$response:charset] ] ^if($env:REMOTE_ADDR eq '127.0.0.1'){ $bShow(true) }{ $bShow(false) ^if($cookie:debug == 1){ $bShow(true) ^if(def $form:undebug || $form:nameless eq 'undebug'){ $bShow(false) $cookie:debug[ $.value(0) $.expires[session] ] } }{ ^if(def $form:debug || $form:nameless eq 'debug'){ $bShow(true) $cookie:debug[ $.value(1) $.expires[session] ] } } } $result[] #end @auto[] ############################################################################### @show[hException;tStack;tClassPath] ^if($self.bShow){ ^if(!def $tClassPath){ $tClassPath[$MAIN:CLASS_PATH] } $result[^CustomException:customHandler[$hException;$tStack;$tClassPath]] }{ $result[^CustomException:defaultHandler[]] } #end @show[] ############################################################################### @customHandler[hException;tStack;tClassPath][sExceptionFile;tExceptionFile;iExceptionLine;iExceptionColumn;sLocatedPath;sTrimmedPath;sLine;tNew] <html> <head> <title>Unhandled exception.</title> <style type="text/css"> body {margin:0; padding:0; font:normal 0.8em Tahoma, Arial} h1 {margin:0.75em 0 0.3em 0; padding:0; font:normal 2em Arial; color:white} h2 {margin:0.75em 0 0.3em 0; padding:0; font:normal 1.75em Arial; color:white} h3 {margin:1em 0 0.5em 0; padding:0; font:bold 1em Tahoma; color:white} p {margin:0} pre {font-size:1.25em; margin:0} b.nb {color:#444; background-color:#fc0; padding:0 0.2em; font-weight:normal} span.tab {background-color:#777; margin:0 0.1em; padding:0 1em; color:#aaa} table, td, tr {padding:0; margin:0; vertical-align:top; border:0; border-collapse:collapse} div.title {padding:0.5em 5% 2em; background-color:#69c; color:white} div.comment {padding:0.5em 5% 2em; background-color:#777; color:white} div.body {padding:0.5em 5% 2em; background-color:#aaa} table.data {font-size:0.95em; color:white} table.data tr.even {background-color:#959595} table.data tr.odd {background-color:#555} table.data tr.nb {background-color:#fc0; color:#444} table.data td {padding:0.25em 0} table.data td.number {padding:0.25em 0.5em} table.data td.line {text-align:right} table.data td.column {padding-right:0.5em} table.data td.center {white-space:nowrap; padding:0.25em 1em} </style> </head> <body> <div class="title"> <h1>Error occured at “$request:uri”</h1> ^if(def $hException.source){ <p>Source &mdash^; ${hException.source}</p> } ^if(def $hException.type){ <p>Exception type: <b>$hException.type</b></p> } ^if(def $hException.file){ <p>Exception location: <b>$hException.file</b> in line <b>$hException.lineno</b> at char <b>$hException.colno</b></p> } </div> <div class="comment"> <h2>Generic comment</h2> ^tClassPath.menu{ ^if(^hException.comment.pos[$tClassPath.path] > 0 && ^tClassPath.path.length[] > ^sLocatedPath.length[]){ $sLocatedPath[$tClassPath.path] $sTrimmedPath[^hException.comment.mid(^hException.comment.pos[$tClassPath.path])] ^sTrimmedPath.match[(${sLocatedPath}.+)\((\d+)\:(\d+)\).*][g]{ $sExceptionFilePath[$match.1] $iExceptionLine($match.2) $iExceptionColumn($match.3) } } } ^if(def $sExceptionFilePath){ <p>^untaint[html]{^hException.comment.match[\/([^^\/]*?)\(][]{/<b class="nb">$match.1</b> (}}</p> }{ $sExceptionFilePath[^hException.file.mid(^request:document-root.length[])] $iExceptionLine($hException.lineno) $iExceptionColumn($hException.colno) <p>^untaint[html]{^hException.file.match[\/([^^\/]*?)^$][]{/<b class="nb">$match.1</b>}} (${iExceptionLine}:$iExceptionColumn): $hException.comment</p> } ^try{ # load the needed lines from file as table $fExceptionFile[^file::load[text;$sExceptionFilePath]] $tExceptionFile[^fExceptionFile.text.split[^#0A]] $tNew[^table::create{lineNumber lineValue}] ^tExceptionFile.menu{ ^tNew.append{^tExceptionFile.line[] ^taint[html][$tExceptionFile.piece]} } $tExceptionFile[^tNew.select(^tNew.line[] >= $iExceptionLine - 5 && ^tNew.line[] <= $iExceptionLine)] # define just a file name $sExceptionFile[^sExceptionFilePath.split[/;rh]] $sExceptionFile[$sExceptionFile.0] # print out <h3>Lines $tExceptionFile.lineNumber&mdash^;^tExceptionFile.offset[set](-1) $tExceptionFile.lineNumber from &ldquo^;$sExceptionFile&rdquo^;</h3> <table class="data"> ^tExceptionFile.menu{ <tr class="^if(^tExceptionFile.offset[] % 2){even}{odd}^if(^tExceptionFile.line[] == ^tExceptionFile.count[]){ nb}"> <td class="number">$tExceptionFile.lineNumber</td> <td class="center"> $sLine[^taint[html][^tExceptionFile.lineValue.match[\t][g]{%%%TA6%%%}]] $sLine[^sLine.match[%%%TA6%%%][g]{<span class="tab">TAB</span>}] $sLine¶^; </td> </tr> } </table> }{ $exception.handled(1) } </div> <div class="body"> ^if($tStack){ <h2>Stack review</h2> <table class="data"> ^tStack.menu{ <tr^if(^tStack.offset[] % 2){ class="even"}> <td class="number">^eval(^tStack.count[] - ^tStack.offset[]).</td> <td>$tStack.name</td> <td class="center">$tStack.file</td> <td class="line">$tStack.lineno</td> <td>:</td> <td class="column">$tStack.colno</td> </tr> } </table> }{ <h2>No stack available</h2> } </div> </body> </html> #end @customException[] ############################################################################### @defaultHandler[][dDate] <html> <head> <title>500 error at $env:SERVER_NAME</title> <style type="text/css"> body {margin:0; padding:0; font:normal 0.8em Tahoma, Arial} h1 {margin:0.75em 0 0.3em 0; padding:0; font:normal 2em Arial; color:white} div.title {padding:0.5em 5% 2em; background-color:#69c; color:white} div.body {padding:0.5em 5%; background-color:#aaa; color:white} </style> </head> <body> <div class="title"> <h1>Server “$env:SERVER_NAME” is down.</h1> <p>It's either being maintenanced or not working properly. Come back soon.</p> </div> <div class="body"> $dDate[^date::now[]] $env:SERVER_NAME at $env:SERVER_ADDR — ^dDate.sql-string[]. </div> </body> </html> #end @defaultHandler[]Ну и вызов:
############################################################################### @unhandled_exception[e;s] ^use[CustomException.p] $result[^CustomException:show[$e;$s;$MAIN:CLASS_PATH]] #end @unhandled_exception[]