Error processing request

Parameters

CONTENT_LENGTH0
REQUEST_METHODGET
REQUEST_URI/revision/catch?V=29
QUERY_STRINGV=29
CONTENT_TYPE
DOCUMENT_URI/revision/catch
DOCUMENT_ROOT/var/www/nikit/nikit/nginx/../docroot
SCGI1
SERVER_PROTOCOLHTTP/1.1
HTTPSon
REMOTE_ADDR172.71.194.61
REMOTE_PORT56768
SERVER_PORT4443
SERVER_NAMEwiki.tcl-lang.org
HTTP_HOSTwiki.tcl-lang.org
HTTP_CONNECTIONKeep-Alive
HTTP_ACCEPT_ENCODINGgzip, br
HTTP_X_FORWARDED_FOR3.238.12.0
HTTP_CF_RAY86bd632599d3172b-IAD
HTTP_X_FORWARDED_PROTOhttps
HTTP_CF_VISITOR{"scheme":"https"}
HTTP_ACCEPT*/*
HTTP_USER_AGENTclaudebot
HTTP_CF_CONNECTING_IP3.238.12.0
HTTP_CDN_LOOPcloudflare
HTTP_CF_IPCOUNTRYUS

Body


Error

Unknow state transition: LINE -> END

-code

1

-level

0

-errorstack

INNER {returnImm {Unknow state transition: LINE -> END} {}} CALL {my render_wikit catch catch\ -\ Evaluate\ script\ and\ trap\ exceptional\ returns\ \n\n'''catch'''\ ''script\ ?varName?''\n**\ Synopsis\ **\nhttp://purl.org/tcl/home/man/tcl8.4/TclCmd/catch.htm\n\nThe\ '''catch'''\ command\ may\ be\ used\ to\ prevent\ errors\ from\ aborting\ command\ interpretation.\ \ '''Catch'''\ calls\ the\ Tcl\ interpreter\ recursively\ to\ execute\ ''script'',\ and\ always\ returns\ without\ raising\ an\ error,\ regardless\ of\ any\ errors\ that\ might\ occur\ while\ executing\ script.\n'''`catch`'''\ ''`script`''\ ?''`messageVarName`''?\ ?''`optionsVarName`''?\nIf\ ''script''\ raises\ an\ error,\ '''catch'''\ will\ return\ a\ non-zero\ integer\ value\ corresponding\ to\ one\ of\ the\ exceptional\ return\ codes\ (see\ tcl.h\ for\ the\ definitions\ of\ code\ values).\ \ If\ the\ ''varName''\ argument\ is\ given,\ then\ the\ variable\ it\ names\ is\ set\ to\ the\ error\ message\ from\ interpreting\ script.\ \n\nIf\ ''script''\ does\ not\ raise\ an\ error,\ catch\ will\ return\ '''0'''\ (TCL_OK)\ and\ set\ the\ variable\ to\ the\ value\ returned\ from\ script.\n\nNote\ that\ '''catch'''\ catches\ all\ exceptions,\ including\ those\ generated\ by\ '''\[break\]'''\ and\ '''\[continue\]''',\ ''and\ '''\[return\]''''',\ as\ well\ as\ errors.\ The\ only\ errors\ that\ are\ not\ caught\ are\ syntax\ errors\ found\ when\ the\ script\ is\ compiled.\ \ This\ is\ because\ the\ catch\ command\ only\ catches\ errors\ during\ runtime.\ \ When\ the\ catch\ statement\ is\ compiled,\ the\ script\ is\ compiled\ as\ well\ and\ any\ syntax\ errors\ will\ generate\ a\ Tcl\ error.\ \ \ \n**\ Documentation\ **\nEXAMPLES\n\nThe\ catch\ command\ may\ be\ used\ in\ an\ '''\[if\]'''\ to\ branch\ based\ on\ the\ success\ of\ a\ script.\ \ \n\n\ if\ \{\ \[catch\ \{open\ \$someFile\ w\}\ fid\]\ \}\ \{\n\ \ \ puts\ stderr\ \"Could\ not\ open\ \$someFile\ for\ writing\\n\$fid\"\n\ \ \ exit\ 1\n\ \}\n\nThe\ '''catch'''\ command\ will\ not\ catch\ compiled\ syntax\ errors.\ \ The\ first\ time\ proc\ '''foo'''\ is\ called,\ the\ body\ will\ be\ compiled\ and\ a\ Tcl\ error\ will\ be\ generated.\ \ \ \n\n\ proc\ foo\ \{\}\ \{\n\ \ \ catch\ \{expr\ \{1\ +-\ \}\}\n\ \}\n\n(from:\ Tcl\ Help\;\ bold\ words\ added\ by\ \[RS\])\n\n----\n\n\nWhy\ is\ it\ a\ bad\ idea\ to\ \"catch\"\ large\ chunks\ of\ code?\ Because\ Tcl\ stops\ execution\ of\ the\ code\ as\ soon\ as\ it\ encounters\ an\ error.\ This\ behavior\ can\ lead\ to\ problems\ like\ this:\n\n======\n\ \ \ \ #\ I've\ got\ an\ open\ socket\ whose\ handle's\ stored\ in\ fid\n\ \ \ \ catch\ \{\n\ \ \ \ \ \ \ \ puts\ \$fid\ \"Here's\ my\ last\ message.\"\n\ \ \ \ \ \ \ \ close\ \$fid\n\ \ \ \ \}\ err\nIf\ the\ \"puts\"\ command\ generates\ an\ error,\ \"catch\"\ detects\ that\ and\ stops\ execution\ of\ the\ code\ block.\ You\ never\ get\ around\ to\ closing\ the\ channel.\ It's\ better\ practice\ to\ put\ separate\ \"catch\"\ commands\ around\nboth\ the\ \"puts\"\ and\ the\ \"close\"\ commands\ to\ detect\ errors\ in\ either\ case\ and\ handle\ them\ appropriately.\n\nThis\ is\ a\ different\ style\ of\ programming\ than\ in\ a\ language\ like\ Java.\ In\ Java,\ you\ can\ have\ a\ variety\ of\ exceptions,\ each\ represented\ by\ a\ different\ class,\ that\ signal\ different\ types\ of\ error\ conditions.\ Then\nin\ a\ \"try\"\ block,\ you\ can\ test\ for\ the\ different\ types\ of\ error\ conditions\ separately\ and\ handle\ them\ in\ different\ ways.\ (My\ complaint\ about\ Java\ is\ that\ there\ seems\ to\ be\ so\ many\ different\ classes,\ I'm\ often\ at\ a\ loss\ as\ to\ which\ ones\ I\ should\ be\ testing\ for.)\ In\ contrast,\ Tcl\ generally\ has\ only\ one\ type\ of\ error.\ In\ theory,\ we\ could\ use\ different\ return\ codes\ to\ signal\ different\ types\ of\ error,\ but\ in\ practice\ this\ is\ hardly\ ever\ used.\n\n----\n\nI\ think\ it\ is\ extreme\ parochialism\ to\ state\ \"it's\ a\ bad\ idea\ to\ code\ this/that\ way\".\ \ It\ is\ perfectly\ reasonable\ to\ catch\ \"large\"\ chunks:\n\n======\n\ \ if\ \{\ \[\ catch\ \{\n\ \ \ \ close\ \$fid\n\}\ err\ \]\ \}\ \{\n\ \}\ err\ \]\ \}\ \{\n\ \ \ \ return\ -code\ error\ \$err\n\}\n\ \}\nIf\ you\ catch\ \"large\"\ chunks\ you\ can\ at\ least\ have\ a\ program\ that\ can\ tolerate\ some\ errors\ that\ you\ did\ not\ anticipate.\ It\ is\ certainly\ better\ to\ fix\ problems\ the\ first\ time\ they\ appear,\ but\ tinkering\ with\ the\ code\ on\ a\ live\ system\ is\ rather\ poor\ practice.\n\nMost\ users\ would\ rather\ ''not''\ have\ the\ software\ come\ to\ a\ screeching\ halt\ on\ every\ unanticipated\ error.\ \ -'''PSE'''\n\n\n----\n\n\n======\n\ set\ resource\ \[some\ allocator\]\n\ if\ \{\[set\ result\ \[catch\ \{some\ code\ with\ \$resource\}\ resulttext\]\]\}\ \{\n\ \ \ \ \ #\ remember\ global\ error\ state,\ as\ de-allocation\ may\ overwrite\ it\n\ \ \ \ \ set\ einfo\ \$::errorInfo\n\ \ \ \ \ set\ ecode\ \$::errorCode\n\ \ \ \ #\ free\ the\ resource,\ ignore\ nested\ errors\n\ \ \ \ \ #\ free\ the\ resource,\ ignore\ nested\ errors\n\ \ \ \ \ catch\ \{deallocate\ \$resource\}\n\ \ \ \ #\ report\ the\ error\ with\ original\ details\n\ \ \ \ \ #\ report\ the\ error\ with\ original\ details\n\ \ \ \ \ return\ -code\ \$result\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ -errorcode\ \$ecode\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ -errorinfo\ \$einfo\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \$resulttext\n\ \}\n\ deallocate\ \$resource\ncontinue\ normally\n\ continue\ normally\nBesides\ a\ full-scale\ Java-style\ `\[try\]`\ implementation\ with\ all\ kinds\ of\ functionality\ for\ the\ catch\ branches,\ this\ could\ probably\ also\ be\ improved\ with\ a\ simpler\ command\ ''withresource'',\ that\ doesn't\ have\ the\ catch\ branch\ functionality,\ like\ this:\nBesides\ a\ full-scale\ Java-style\ \[try\]\ implementation\ with\ all\ kinds\ of\ functionality\ for\ the\ catch\ branches,\ this\ could\ probably\ also\ be\ improved\ with\ a\ simpler\ command\ ''withresource'',\ that\ doesn't\ have\ the\ catch\ branch\ functionality,\ like\ this:\n======\n\ set\ resource\ \[some\ allocator\]\n\ withresource\ \{\n\ \ \ \ \ some\ code\ with\ \$resource\n\ \}\ finally\ \{\n\ \ \ \ \ #\ this\ would\ be\ executed\ always,\ even\ in\ case\ of\ error\n\ \ \ \ \ deallocate\ \$resource\n\ \}\ncontinue\ normally\n\ continue\ normally\n\[HaO\]\ 2012-02-17:\ Within\ the\ upper\ code,\ one\ may\ use\ the\ tcl\ 8.5\ feature\ of\ an\ option\ dict\ returned\ by\ catch.\n----\n\n\[MS\]:\ ''Oops,\ forgot\ to\ mention\ it\ here:\ this\ bug\ was\ closed\ on\ 2000-10-25,\ it\ is\ fixed\ in\ tcl8.4a4.''\n\nNote\ that\ the\ bytecode\ compiling\ of\ \[\[catch\]\]\ in\ Tcl\ 8.x\ has\ a\ bug.\ '''\[catch\]'''\ will\ inappropriately\ catch\ errors\ in\ the\ substitution\ of\ its\ arguments:\n\n\ %\ #\ should\ return\ 'foo'\n\ %\ catch\ \[error\ foo\]\n\ 1\n\nCompare\ with\ Tcl\ 7.6:\n\n\ %\ catch\ \[error\ foo\]\n\ foo\n\nTo\ work\ around\ the\ bug,\ defeat\ the\ bytecode\ compiler\ by\ generating\ '''\[catch\]''':\n\n\ %\ \[format\ catch\]\ \[error\ foo\]\n\ foo\n\nTrack\ Sourceforge\ bug\ #\ 119184\ to\ learn\ if/when\ this\ bug\ is\ fixed.\nhttp://sourceforge.net/bugs/?func=detailbug&bug_id=119184&group_id=10894\n\n'''DGP'''\n\n----\n\nExample\ for\ caught\ return,\ from\ a\ posting\ of\ \[George\ Petasis\]\ in\ \[the\ comp.lang.tcl\ newsgroup\]:\n======\n\ %\ proc\ foo\ \{\}\ \{\n\ \ \ \ \ \ \ \ puts\ \"catch\ result\ is\ :\[catch\ \{\ return\}\]\"\n\ \ \ \ \ \ \ \ puts\ \"after\ return\"\n\ \}\ \n\ %\ foo\n\ catch\ result\ is\ :2\n\ after\ return\ \n\n----\n\nFor\ a\ more\ complex\ worked\ example\ of\ catching\ \[\[break\]\],\ \[\[continue\]\],\ \[\[error\]\]\ and\ \[\[return\]\],\ this\ Wiki\ has\ a\ pure\ Tcl\ implementation\ of\ a\ Java-style\ \[try\ ...\ finally\ ...\]\ construct.\ \ --\ \[KBK\]\ 24\ Dec\ 2000\n**\ `\[catch\]`\ and\ `\[exec\]`\ **\n----\nThe\ options\ dictionary\ from\ catching\ a\ call\ to\ `\[exec\]`\ contains\ a\ wealth\ of\nWhen\ you\ \[\[catch\]\]\ the\ result\ of\ an\ \[\[exec\]\]\ command,\ ''\$::errorCode''\ contains\ a\ wealth\ of\ information\ about\ what\ happened.\ \ See\ the\ \[exec\]\ page\ for\ how\ to\ take\ it\ apart.\nOn\ comp.lang.tcl,\ Ulrich\ Schoebel\ shows\ this\ as\ an\ example\ of\ how\ to\ get\ at\ the\ exit\ code\ of\ a\ command\ being\ \[exec\]'d\ in\ \[Tcl\]:\n----\n======\n\n\[MS\]:\ this\ will\ work\ as\ long\ as\ the\ ''unknown''\ proc\ has\ not\ been\ modified,\ and\ is\ relatively\ slow\ as\ the\ whole\ error\ processing\ machinery\ is\ also\ set\ in\ motion.\ If\ you\ want\ to\ use\ this\ approach\ in\ a\ more\ robust\ and\ fast\ manner,\ you\ may\ want\ to\ define\n\n======\n\ \ \ proc\ throw\ \{\{msg\ \{\}\}\ \{code\ 10\}\}\ \{\n\ \ \ \ \ \ \ return\ -code\ \$code\ \$msg\n\ \ \ \}\nThis\ will\ throw\ an\ exception,\ caught\ by\ ''catch''\;\ it\ will\ only\ be\ an\ error\ if\ code\ is\ set\ to\ \"error\"\ (or\ 1)\;\ do\ not\ use\ codes\ 0\ to\ 4\ in\ general\ as\ they\ have\ special\ meaning:\ \n\n\ \ \ 0\ \ \ \ \ \ \ TCL_OK\ \ \ \ \ \ \ \ \ normal\ return\ \n\ \ \ 1\ \ \ \ \ \ \ TCL_ERROR\ \ \ \ \ \ error\ return\n\ \ \ 2\ \ \ \ \ \ \ TCL_RETURN\ \ \ \ \ cause\ the\ *caller*\ to\ return\n\ \ \ 3\ \ \ \ \ \ \ TCL_BREAK\ \ \ \ \ \ call\ \[break\]\ in\ the\ caller\n\ \ \ 4\ \ \ \ \ \ \ TCL_CONTINUE\ \ \ call\ \[continue\]\ in\ the\ caller\n======none\n----\n\nSee\ also\ \[Tcl\ performance:\ catch\ vs.\ info\]\ for\ the\ slowness\ of\ catch.\n\n----\n\nA\ common\ use\ for\ catch\ is\ when\ invoking\ external\ commands\ via\ \[exec\]\ .\ Since\ '''any'''\ non-zero\ return\ code\ would\ otherwise\ result\ in\ a\ raised\ error,\ one\ typically\ wraps\ the\ invocation\ with\ catch\ and\ then\ checks\ for\ the\ appropriate\ things.\ \ Since\ grep\ is\ just\ one\ example\ of\ a\ Unix\ command\ which\ uses\ a\ non-zero\ return\ code\ to\ mean\ something\ other\ than\ ''error'',\ one\ needs\ to\ be\ aware\ of\ cases\ like\ this\ when\ writing\ the\ exec.\n\n\[\[does\ someone\ have\ an\ idiom\ for\ execing\ a\ command,\ capturing\ the\ stdout,\ stderr,\ return\ code,\ etc.\ testing\ the\ return\ code\ and\ producing\ useful\ output\ based\ on\ stderr\ when\ appropriate,\ etc.?\ \ Answer:\n\"\[UNIX\ only\ exec\ wrapper\]\"\ is\ one\ model.\]\]\n**\ `catch`\ and\ stderr\ **\n----\nSomeone\ mentioned\ on\ \[comp.lang.tcl\]\ that\ it\ took\ them\ a\ while\ to\ understand\ that\ when\ you\ use\ catch\ and\ supply\ a\ variable,\ the\ output\ from\ the\ command\ that\ would\ go\ to\ stderr\ ends\ up\ in\ the\ variable.\nSomeone\ mentioned\ on\ comp.lang.tcl\ that\ it\ took\ them\ a\ while\ to\ understand\ that\ when\ you\ use\ catch\ and\ supply\ a\ variable,\ the\ output\ from\ the\ command\ that\ would\ go\ to\ stderr\ ends\ up\ in\ the\ variable.\n\n----\n\nOn\ comp.lang.tcl,\ Ulrich\ Schoebel\ shows\ this\ as\ an\ example\ of\ how\ to\ get\ at\ the\ exit\ code\ of\ a\ command\ being\ \[exec\]'d\ in\ \[Tcl\]:\n**\ `\[return\]`\ **\n\ if\ \{\[catch\ \{exec\ grep\ -q\ pippo\ /etc/passwd\}\ result\]\}\ \{\n\ \ #\ non-zero\ exit\ status,\ get\ it:\n\ \ set\ status\ \[lindex\ \$errorCode\ 2\]\n\ \}\ else\ \{\n\ \ #\ exit\ status\ was\ 0\n\ \ #\ result\ contains\ the\ result\ of\ your\ command\n\ \ set\ status\ 0\n\ \}\n\[JMN\]\ 2007-11-24:\n\[glennj\]:\ the\ above\ is\ ''slightly''\ lazy.\ \ The\ definitive\ method\ is\ seen\ as\ KBK's\ contribution\ to\ the\ \[exec\]\ page.\nI've\ been\ in\ the\ habit\ of\ using\ the\ idiom:\n\[LES\]:\ or\ should\ one\ rather\ follow\ advice\ given\ at\ \[exec\ and\ error\ information\]?\n\n----\n======\nSee\ also:\n\n\ \ \ *\ \[exec\]\n\ \ \ *\ \[magic\ names\]\n\ \ \ *\ \[errorCode\]\n\n----\n\[\[\n\[Tcl\ syntax\ help\]\ |\n\[Arts\ and\ Crafts\ of\ Tcl-Tk\ Programming\]\ |\n\[Category\ Command\]\ |\n\[Category\ Control\ Structure\]\n\]\] regexp2} CALL {my render catch catch\ -\ Evaluate\ script\ and\ trap\ exceptional\ returns\ \n\n'''catch'''\ ''script\ ?varName?''\n**\ Synopsis\ **\nhttp://purl.org/tcl/home/man/tcl8.4/TclCmd/catch.htm\n\nThe\ '''catch'''\ command\ may\ be\ used\ to\ prevent\ errors\ from\ aborting\ command\ interpretation.\ \ '''Catch'''\ calls\ the\ Tcl\ interpreter\ recursively\ to\ execute\ ''script'',\ and\ always\ returns\ without\ raising\ an\ error,\ regardless\ of\ any\ errors\ that\ might\ occur\ while\ executing\ script.\n'''`catch`'''\ ''`script`''\ ?''`messageVarName`''?\ ?''`optionsVarName`''?\nIf\ ''script''\ raises\ an\ error,\ '''catch'''\ will\ return\ a\ non-zero\ integer\ value\ corresponding\ to\ one\ of\ the\ exceptional\ return\ codes\ (see\ tcl.h\ for\ the\ definitions\ of\ code\ values).\ \ If\ the\ ''varName''\ argument\ is\ given,\ then\ the\ variable\ it\ names\ is\ set\ to\ the\ error\ message\ from\ interpreting\ script.\ \n\nIf\ ''script''\ does\ not\ raise\ an\ error,\ catch\ will\ return\ '''0'''\ (TCL_OK)\ and\ set\ the\ variable\ to\ the\ value\ returned\ from\ script.\n\nNote\ that\ '''catch'''\ catches\ all\ exceptions,\ including\ those\ generated\ by\ '''\[break\]'''\ and\ '''\[continue\]''',\ ''and\ '''\[return\]''''',\ as\ well\ as\ errors.\ The\ only\ errors\ that\ are\ not\ caught\ are\ syntax\ errors\ found\ when\ the\ script\ is\ compiled.\ \ This\ is\ because\ the\ catch\ command\ only\ catches\ errors\ during\ runtime.\ \ When\ the\ catch\ statement\ is\ compiled,\ the\ script\ is\ compiled\ as\ well\ and\ any\ syntax\ errors\ will\ generate\ a\ Tcl\ error.\ \ \ \n**\ Documentation\ **\nEXAMPLES\n\nThe\ catch\ command\ may\ be\ used\ in\ an\ '''\[if\]'''\ to\ branch\ based\ on\ the\ success\ of\ a\ script.\ \ \n\n\ if\ \{\ \[catch\ \{open\ \$someFile\ w\}\ fid\]\ \}\ \{\n\ \ \ puts\ stderr\ \"Could\ not\ open\ \$someFile\ for\ writing\\n\$fid\"\n\ \ \ exit\ 1\n\ \}\n\nThe\ '''catch'''\ command\ will\ not\ catch\ compiled\ syntax\ errors.\ \ The\ first\ time\ proc\ '''foo'''\ is\ called,\ the\ body\ will\ be\ compiled\ and\ a\ Tcl\ error\ will\ be\ generated.\ \ \ \n\n\ proc\ foo\ \{\}\ \{\n\ \ \ catch\ \{expr\ \{1\ +-\ \}\}\n\ \}\n\n(from:\ Tcl\ Help\;\ bold\ words\ added\ by\ \[RS\])\n\n----\n\n\nWhy\ is\ it\ a\ bad\ idea\ to\ \"catch\"\ large\ chunks\ of\ code?\ Because\ Tcl\ stops\ execution\ of\ the\ code\ as\ soon\ as\ it\ encounters\ an\ error.\ This\ behavior\ can\ lead\ to\ problems\ like\ this:\n\n======\n\ \ \ \ #\ I've\ got\ an\ open\ socket\ whose\ handle's\ stored\ in\ fid\n\ \ \ \ catch\ \{\n\ \ \ \ \ \ \ \ puts\ \$fid\ \"Here's\ my\ last\ message.\"\n\ \ \ \ \ \ \ \ close\ \$fid\n\ \ \ \ \}\ err\nIf\ the\ \"puts\"\ command\ generates\ an\ error,\ \"catch\"\ detects\ that\ and\ stops\ execution\ of\ the\ code\ block.\ You\ never\ get\ around\ to\ closing\ the\ channel.\ It's\ better\ practice\ to\ put\ separate\ \"catch\"\ commands\ around\nboth\ the\ \"puts\"\ and\ the\ \"close\"\ commands\ to\ detect\ errors\ in\ either\ case\ and\ handle\ them\ appropriately.\n\nThis\ is\ a\ different\ style\ of\ programming\ than\ in\ a\ language\ like\ Java.\ In\ Java,\ you\ can\ have\ a\ variety\ of\ exceptions,\ each\ represented\ by\ a\ different\ class,\ that\ signal\ different\ types\ of\ error\ conditions.\ Then\nin\ a\ \"try\"\ block,\ you\ can\ test\ for\ the\ different\ types\ of\ error\ conditions\ separately\ and\ handle\ them\ in\ different\ ways.\ (My\ complaint\ about\ Java\ is\ that\ there\ seems\ to\ be\ so\ many\ different\ classes,\ I'm\ often\ at\ a\ loss\ as\ to\ which\ ones\ I\ should\ be\ testing\ for.)\ In\ contrast,\ Tcl\ generally\ has\ only\ one\ type\ of\ error.\ In\ theory,\ we\ could\ use\ different\ return\ codes\ to\ signal\ different\ types\ of\ error,\ but\ in\ practice\ this\ is\ hardly\ ever\ used.\n\n----\n\nI\ think\ it\ is\ extreme\ parochialism\ to\ state\ \"it's\ a\ bad\ idea\ to\ code\ this/that\ way\".\ \ It\ is\ perfectly\ reasonable\ to\ catch\ \"large\"\ chunks:\n\n======\n\ \ if\ \{\ \[\ catch\ \{\n\ \ \ \ close\ \$fid\n\}\ err\ \]\ \}\ \{\n\ \}\ err\ \]\ \}\ \{\n\ \ \ \ return\ -code\ error\ \$err\n\}\n\ \}\nIf\ you\ catch\ \"large\"\ chunks\ you\ can\ at\ least\ have\ a\ program\ that\ can\ tolerate\ some\ errors\ that\ you\ did\ not\ anticipate.\ It\ is\ certainly\ better\ to\ fix\ problems\ the\ first\ time\ they\ appear,\ but\ tinkering\ with\ the\ code\ on\ a\ live\ system\ is\ rather\ poor\ practice.\n\nMost\ users\ would\ rather\ ''not''\ have\ the\ software\ come\ to\ a\ screeching\ halt\ on\ every\ unanticipated\ error.\ \ -'''PSE'''\n\n\n----\n\n\n======\n\ set\ resource\ \[some\ allocator\]\n\ if\ \{\[set\ result\ \[catch\ \{some\ code\ with\ \$resource\}\ resulttext\]\]\}\ \{\n\ \ \ \ \ #\ remember\ global\ error\ state,\ as\ de-allocation\ may\ overwrite\ it\n\ \ \ \ \ set\ einfo\ \$::errorInfo\n\ \ \ \ \ set\ ecode\ \$::errorCode\n\ \ \ \ #\ free\ the\ resource,\ ignore\ nested\ errors\n\ \ \ \ \ #\ free\ the\ resource,\ ignore\ nested\ errors\n\ \ \ \ \ catch\ \{deallocate\ \$resource\}\n\ \ \ \ #\ report\ the\ error\ with\ original\ details\n\ \ \ \ \ #\ report\ the\ error\ with\ original\ details\n\ \ \ \ \ return\ -code\ \$result\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ -errorcode\ \$ecode\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ -errorinfo\ \$einfo\ \\\n\ \ \ \ \ \ \ \ \ \ \ \ \$resulttext\n\ \}\n\ deallocate\ \$resource\ncontinue\ normally\n\ continue\ normally\nBesides\ a\ full-scale\ Java-style\ `\[try\]`\ implementation\ with\ all\ kinds\ of\ functionality\ for\ the\ catch\ branches,\ this\ could\ probably\ also\ be\ improved\ with\ a\ simpler\ command\ ''withresource'',\ that\ doesn't\ have\ the\ catch\ branch\ functionality,\ like\ this:\nBesides\ a\ full-scale\ Java-style\ \[try\]\ implementation\ with\ all\ kinds\ of\ functionality\ for\ the\ catch\ branches,\ this\ could\ probably\ also\ be\ improved\ with\ a\ simpler\ command\ ''withresource'',\ that\ doesn't\ have\ the\ catch\ branch\ functionality,\ like\ this:\n======\n\ set\ resource\ \[some\ allocator\]\n\ withresource\ \{\n\ \ \ \ \ some\ code\ with\ \$resource\n\ \}\ finally\ \{\n\ \ \ \ \ #\ this\ would\ be\ executed\ always,\ even\ in\ case\ of\ error\n\ \ \ \ \ deallocate\ \$resource\n\ \}\ncontinue\ normally\n\ continue\ normally\n\[HaO\]\ 2012-02-17:\ Within\ the\ upper\ code,\ one\ may\ use\ the\ tcl\ 8.5\ feature\ of\ an\ option\ dict\ returned\ by\ catch.\n----\n\n\[MS\]:\ ''Oops,\ forgot\ to\ mention\ it\ here:\ this\ bug\ was\ closed\ on\ 2000-10-25,\ it\ is\ fixed\ in\ tcl8.4a4.''\n\nNote\ that\ the\ bytecode\ compiling\ of\ \[\[catch\]\]\ in\ Tcl\ 8.x\ has\ a\ bug.\ '''\[catch\]'''\ will\ inappropriately\ catch\ errors\ in\ the\ substitution\ of\ its\ arguments:\n\n\ %\ #\ should\ return\ 'foo'\n\ %\ catch\ \[error\ foo\]\n\ 1\n\nCompare\ with\ Tcl\ 7.6:\n\n\ %\ catch\ \[error\ foo\]\n\ foo\n\nTo\ work\ around\ the\ bug,\ defeat\ the\ bytecode\ compiler\ by\ generating\ '''\[catch\]''':\n\n\ %\ \[format\ catch\]\ \[error\ foo\]\n\ foo\n\nTrack\ Sourceforge\ bug\ #\ 119184\ to\ learn\ if/when\ this\ bug\ is\ fixed.\nhttp://sourceforge.net/bugs/?func=detailbug&bug_id=119184&group_id=10894\n\n'''DGP'''\n\n----\n\nExample\ for\ caught\ return,\ from\ a\ posting\ of\ \[George\ Petasis\]\ in\ \[the\ comp.lang.tcl\ newsgroup\]:\n======\n\ %\ proc\ foo\ \{\}\ \{\n\ \ \ \ \ \ \ \ puts\ \"catch\ result\ is\ :\[catch\ \{\ return\}\]\"\n\ \ \ \ \ \ \ \ puts\ \"after\ return\"\n\ \}\ \n\ %\ foo\n\ catch\ result\ is\ :2\n\ after\ return\ \n\n----\n\nFor\ a\ more\ complex\ worked\ example\ of\ catching\ \[\[break\]\],\ \[\[continue\]\],\ \[\[error\]\]\ and\ \[\[return\]\],\ this\ Wiki\ has\ a\ pure\ Tcl\ implementation\ of\ a\ Java-style\ \[try\ ...\ finally\ ...\]\ construct.\ \ --\ \[KBK\]\ 24\ Dec\ 2000\n**\ `\[catch\]`\ and\ `\[exec\]`\ **\n----\nThe\ options\ dictionary\ from\ catching\ a\ call\ to\ `\[exec\]`\ contains\ a\ wealth\ of\nWhen\ you\ \[\[catch\]\]\ the\ result\ of\ an\ \[\[exec\]\]\ command,\ ''\$::errorCode''\ contains\ a\ wealth\ of\ information\ about\ what\ happened.\ \ See\ the\ \[exec\]\ page\ for\ how\ to\ take\ it\ apart.\nOn\ comp.lang.tcl,\ Ulrich\ Schoebel\ shows\ this\ as\ an\ example\ of\ how\ to\ get\ at\ the\ exit\ code\ of\ a\ command\ being\ \[exec\]'d\ in\ \[Tcl\]:\n----\n======\n\n\[MS\]:\ this\ will\ work\ as\ long\ as\ the\ ''unknown''\ proc\ has\ not\ been\ modified,\ and\ is\ relatively\ slow\ as\ the\ whole\ error\ processing\ machinery\ is\ also\ set\ in\ motion.\ If\ you\ want\ to\ use\ this\ approach\ in\ a\ more\ robust\ and\ fast\ manner,\ you\ may\ want\ to\ define\n\n======\n\ \ \ proc\ throw\ \{\{msg\ \{\}\}\ \{code\ 10\}\}\ \{\n\ \ \ \ \ \ \ return\ -code\ \$code\ \$msg\n\ \ \ \}\nThis\ will\ throw\ an\ exception,\ caught\ by\ ''catch''\;\ it\ will\ only\ be\ an\ error\ if\ code\ is\ set\ to\ \"error\"\ (or\ 1)\;\ do\ not\ use\ codes\ 0\ to\ 4\ in\ general\ as\ they\ have\ special\ meaning:\ \n\n\ \ \ 0\ \ \ \ \ \ \ TCL_OK\ \ \ \ \ \ \ \ \ normal\ return\ \n\ \ \ 1\ \ \ \ \ \ \ TCL_ERROR\ \ \ \ \ \ error\ return\n\ \ \ 2\ \ \ \ \ \ \ TCL_RETURN\ \ \ \ \ cause\ the\ *caller*\ to\ return\n\ \ \ 3\ \ \ \ \ \ \ TCL_BREAK\ \ \ \ \ \ call\ \[break\]\ in\ the\ caller\n\ \ \ 4\ \ \ \ \ \ \ TCL_CONTINUE\ \ \ call\ \[continue\]\ in\ the\ caller\n======none\n----\n\nSee\ also\ \[Tcl\ performance:\ catch\ vs.\ info\]\ for\ the\ slowness\ of\ catch.\n\n----\n\nA\ common\ use\ for\ catch\ is\ when\ invoking\ external\ commands\ via\ \[exec\]\ .\ Since\ '''any'''\ non-zero\ return\ code\ would\ otherwise\ result\ in\ a\ raised\ error,\ one\ typically\ wraps\ the\ invocation\ with\ catch\ and\ then\ checks\ for\ the\ appropriate\ things.\ \ Since\ grep\ is\ just\ one\ example\ of\ a\ Unix\ command\ which\ uses\ a\ non-zero\ return\ code\ to\ mean\ something\ other\ than\ ''error'',\ one\ needs\ to\ be\ aware\ of\ cases\ like\ this\ when\ writing\ the\ exec.\n\n\[\[does\ someone\ have\ an\ idiom\ for\ execing\ a\ command,\ capturing\ the\ stdout,\ stderr,\ return\ code,\ etc.\ testing\ the\ return\ code\ and\ producing\ useful\ output\ based\ on\ stderr\ when\ appropriate,\ etc.?\ \ Answer:\n\"\[UNIX\ only\ exec\ wrapper\]\"\ is\ one\ model.\]\]\n**\ `catch`\ and\ stderr\ **\n----\nSomeone\ mentioned\ on\ \[comp.lang.tcl\]\ that\ it\ took\ them\ a\ while\ to\ understand\ that\ when\ you\ use\ catch\ and\ supply\ a\ variable,\ the\ output\ from\ the\ command\ that\ would\ go\ to\ stderr\ ends\ up\ in\ the\ variable.\nSomeone\ mentioned\ on\ comp.lang.tcl\ that\ it\ took\ them\ a\ while\ to\ understand\ that\ when\ you\ use\ catch\ and\ supply\ a\ variable,\ the\ output\ from\ the\ command\ that\ would\ go\ to\ stderr\ ends\ up\ in\ the\ variable.\n\n----\n\nOn\ comp.lang.tcl,\ Ulrich\ Schoebel\ shows\ this\ as\ an\ example\ of\ how\ to\ get\ at\ the\ exit\ code\ of\ a\ command\ being\ \[exec\]'d\ in\ \[Tcl\]:\n**\ `\[return\]`\ **\n\ if\ \{\[catch\ \{exec\ grep\ -q\ pippo\ /etc/passwd\}\ result\]\}\ \{\n\ \ #\ non-zero\ exit\ status,\ get\ it:\n\ \ set\ status\ \[lindex\ \$errorCode\ 2\]\n\ \}\ else\ \{\n\ \ #\ exit\ status\ was\ 0\n\ \ #\ result\ contains\ the\ result\ of\ your\ command\n\ \ set\ status\ 0\n\ \}\n\[JMN\]\ 2007-11-24:\n\[glennj\]:\ the\ above\ is\ ''slightly''\ lazy.\ \ The\ definitive\ method\ is\ seen\ as\ KBK's\ contribution\ to\ the\ \[exec\]\ page.\nI've\ been\ in\ the\ habit\ of\ using\ the\ idiom:\n\[LES\]:\ or\ should\ one\ rather\ follow\ advice\ given\ at\ \[exec\ and\ error\ information\]?\n\n----\n======\nSee\ also:\n\n\ \ \ *\ \[exec\]\n\ \ \ *\ \[magic\ names\]\n\ \ \ *\ \[errorCode\]\n\n----\n\[\[\n\[Tcl\ syntax\ help\]\ |\n\[Arts\ and\ Crafts\ of\ Tcl-Tk\ Programming\]\ |\n\[Category\ Command\]\ |\n\[Category\ Control\ Structure\]\n\]\]} CALL {my revision catch} CALL {::oo::Obj1227448 process revision/catch} CALL {::oo::Obj1227446 process}

-errorcode

NONE

-errorinfo

Unknow state transition: LINE -> END
    while executing
"error $msg"
    (class "::Wiki" method "render_wikit" line 6)
    invoked from within
"my render_$default_markup $N $C $mkup_rendering_engine"
    (class "::Wiki" method "render" line 8)
    invoked from within
"my render $name $C"
    (class "::Wiki" method "revision" line 31)
    invoked from within
"my revision $page"
    (class "::Wiki" method "process" line 56)
    invoked from within
"$server process [string trim $uri /]"

-errorline

4