<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://powershell.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Dreaming in PowerShell : Stacktrace</title><link>http://powershell.com/cs/blogs/tobias/archive/tags/Stacktrace/default.aspx</link><description>Tags: Stacktrace</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Trapping Errors</title><link>http://powershell.com/cs/blogs/tobias/archive/2008/09/29/trapping-errors.aspx</link><pubDate>Mon, 29 Sep 2008 12:13:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:30</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=30</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2008/09/29/trapping-errors.aspx#comments</comments><description>&lt;p&gt;A lot of people are confused and ask how to correctly trap errors. Let&amp;#39;s see how that works.&lt;/p&gt;
&lt;h2&gt;Default Error Handling&lt;/h2&gt;
&lt;p&gt;Whenever an error occurs, a so called &amp;quot;exception&amp;quot; is raised. If noone bothers to &amp;quot;handle&amp;quot; that exception, it finally ends up being handled by PowerShell, and PowerShell does whatever you have specified in $ErrorActionPreference. The default setting is &amp;quot;Continue&amp;quot;, so a red error message appears in your console, and PowerShell continues with the next statement. &lt;/p&gt;
&lt;p&gt;Other possible settings are &amp;quot;SilentlyContinue&amp;quot; (no error message), &amp;quot;Inquire&amp;quot; (asking whether you want to continue or abort a script) or &amp;quot;Stop&amp;quot; (stopping execution). While the setting defined in $ErrorActionPreference is the default if no other preference is specified, almost all Cmdlets support the -EA parameter where you can specify an individual setting just for that call. -EA beats the default setting in $ErrorActionPreference. It is in fact an alias for the -ErrorAction parameter so you can use -ErrorAction instead of -EA as well.&lt;/p&gt;
&lt;h2&gt;Trapping Errors&lt;/h2&gt;
&lt;p&gt;To catch an error yourself, you use the Trap statement. It expects a script block that gets executed whenever an unhandled exception is raised. Let&amp;#39;s take a look at that:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;Trap&lt;/span&gt; { &lt;span class="string"&gt;&amp;#39;Something terrible happened!&amp;#39;&lt;/span&gt; }
1&lt;span class="op"&gt;/&lt;/span&gt;&lt;span class="var"&gt;$null&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The first thing you will notice is that this will have no effect when entered interactively. Traps only work inside of scripts. The second thing you notice is that when you run this as script, you will receive both your error message and the red PowerShell error message. &lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;. &lt;span class="string"&gt;&amp;#39;C:\Scripts\test.ps1&amp;#39;&lt;/span&gt;&lt;div class="output"&gt;Something terrible happened!&lt;br /&gt;&lt;span class="error"&gt;Attempted to divide by zero.&lt;br /&gt;At C:\Scripts\test.ps1:2 Char:3&lt;br /&gt;+&amp;nbsp;1/ &amp;lt;&amp;lt;&amp;lt;&amp;lt; null&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is because your Trap did not really handle the exception. To handle an exception, you need to add the &amp;quot;Continue&amp;quot; statement to your trap:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; { &lt;span class="string"&gt;&amp;#39;Something terrible happened!&amp;#39;&lt;/span&gt;; &lt;span class="keyword"&gt;continue&lt;/span&gt; }&lt;br /&gt;1&lt;span class="op"&gt;/&lt;/span&gt;&lt;span class="var"&gt;$null&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, the trap works as expected. It does whatever you specified in the trap script block, and PowerShell does not get to see the exception anymore. You no longer get the red error message.&lt;/p&gt;
&lt;h2&gt;Meaningful Traps&lt;/h2&gt;
&lt;p&gt;Most often, you want your trap to respond to individual errors adequately so it would be nice to know what kind of error actually occured. This is why inside your trap script block, you can access the current error record using the special variable $_. So to output the original error message, your trap could look like this:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; { &lt;span class="string"&gt;&amp;#39;Hey, that did not work: {0}&amp;#39;&lt;/span&gt; &lt;span class="op"&gt;-f&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;Exception.Message&lt;/span&gt;; &lt;span class="keyword"&gt;continue&lt;/span&gt;}&lt;br /&gt;1&lt;span class="op"&gt;/&lt;/span&gt;&lt;span class="var"&gt;$null&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Unfortunately, the error record in $_ is valid only inside the trap so you do not get code completion for it. With a little trick, however, you can examine the object model because $_ is identical to the last error record in your error record list. When you enter interactively the following command after catching an error, you can see the very same error record:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="var"&gt;$error&lt;/span&gt;[0].&lt;span class="namespace"&gt;Exception.Message&lt;/span&gt;&lt;div class="output"&gt;&lt;span class="error"&gt;Attempted to divide by zero.&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;In PowerShellPlus, you get full intellisense-like code completion for the object. Soon, you will discover that each error has a category info and a type:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="var"&gt;$error&lt;/span&gt;[0].&lt;span class="namespace"&gt;CategoryInfo.Category&lt;/span&gt;&lt;div class="output"&gt;&lt;span class="error"&gt;NotSpecified&lt;/span&gt;&lt;/div&gt;&lt;span class="var"&gt;$error&lt;/span&gt;[0].&lt;span class="method"&gt;FullyQualifiedErrorId&lt;/span&gt;&lt;div class="output"&gt;&lt;span class="error"&gt;RuntimeException&lt;/span&gt;&lt;/div&gt;&lt;span class="var"&gt;$error&lt;/span&gt;[0].&lt;span class="namespace"&gt;Exception.GetType&lt;/span&gt;().&lt;span class="method"&gt;FullName&lt;/span&gt;&lt;div class="output"&gt;&lt;span class="error"&gt;System.Management.Automation.RuntimeException&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Those will be important when you try and handle different error types (just a second). They do not always produce results. For a simple error such as 1/$null, for example, you will not get a meaningful FullyQualifiedErrorID. &lt;/p&gt;
&lt;h2&gt;Make sure Cmdlets Raise Exceptions!&lt;/h2&gt;
&lt;p&gt;What if your trap is never called? Take a look at the following piece of code! There is a trap and there is an error but still PowerShell handles the error! Why?&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; { &lt;br /&gt;  &lt;span class="string"&gt;&amp;#39;Error Category {0}, Error Type {1}, ID: {2}, Message: {3}&amp;#39;&lt;/span&gt; &lt;span class="op"&gt;-f&lt;/span&gt;&lt;br /&gt;  &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;CategoryInfo.Category&lt;/span&gt;, &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;Exception.GetType&lt;/span&gt;().&lt;span class="method"&gt;FullName&lt;/span&gt;,&lt;br /&gt;  &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullyQualifiedErrorID&lt;/span&gt;, &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;Exception.Message&lt;/span&gt;; &lt;br /&gt;  &lt;span class="keyword"&gt;continue&lt;/span&gt; &lt;br /&gt;}&lt;br /&gt;dir c:\wrongfoldername&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Funny enough, your trap is never called. Instead, PowerShell outputs its default error message. This is because Cmdlets handle their errors themselves, and no exception is raised. The error is &amp;quot;invisible&amp;quot; to your trap. To make it visible, you need to set $ErrorActionPreference to &amp;#39;Stop&amp;#39;. Whenever a Cmdlet causes an error, this setting will generate a &amp;quot;Stop&amp;quot; exception which then can be caught by your trap. Either set $ErrorActionPreference to &amp;#39;Stop&amp;#39; to apply to all Cmdlets in your script, or specify the -EA parameter individually:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; { &lt;br /&gt;  &lt;span class="string"&gt;&amp;#39;Error Category {0}, Error Type {1}, ID: {2}, Message: {3}&amp;#39;&lt;/span&gt; &lt;span class="op"&gt;-f&lt;/span&gt;&lt;br /&gt;  &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;CategoryInfo.Category&lt;/span&gt;, &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;Exception.GetType&lt;/span&gt;().&lt;span class="method"&gt;FullName&lt;/span&gt;,&lt;br /&gt;  &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullyQualifiedErrorID&lt;/span&gt;, &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;Exception.Message&lt;/span&gt;; &lt;br /&gt;  &lt;span class="keyword"&gt;continue&lt;/span&gt; &lt;br /&gt;}&lt;br /&gt;dir c:\wrongfoldername &lt;span class="modifier"&gt;-EA&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;Stop&amp;#39;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;On a side note, exceptions caused by pure syntactical errors like 1/0 can never be caught by your traps because those errors are detected during parsing even before the script had a chance to run.&lt;/p&gt;
&lt;h2&gt;Specialized Traps&lt;/h2&gt;
&lt;p&gt;While it is perfectly ok for a trap to handle all exceptions and distinguish the error type internally by looking at the CategoryInfo and FullyQualifiedErrorID, sometimes it is easier to implement different traps for different errors. To do that, you need to know the type of an exception that you want to catch. Here is an example:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="var"&gt;$oldsetting&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$ErrorActionPreference&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$ErrorActionPreference&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;Stop&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; [&lt;span class="namespace"&gt;System.Management.Automation.ActionPreferenceStopException&lt;/span&gt;]  { &lt;br /&gt;  &lt;span class="string"&gt;&amp;#39;The Cmdlet {0} caused this error: {1}&amp;#39;&lt;/span&gt; &lt;span class="op"&gt;-f&lt;/span&gt; &lt;br /&gt;  &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;CategoryInfo.Activity&lt;/span&gt;, &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;Exception.Message&lt;/span&gt;; &lt;br /&gt;  &lt;span class="keyword"&gt;continue&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; [&lt;span class="namespace"&gt;System.Management.Automation.RuntimeException&lt;/span&gt;] { &lt;br /&gt;  &lt;span class="string"&gt;&amp;#39;A runtime exception occured: {0}&amp;#39;&lt;/span&gt; &lt;span class="op"&gt;-f&lt;/span&gt; &lt;br /&gt;  &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;Exception.Message&lt;/span&gt;; &lt;br /&gt;  &lt;span class="keyword"&gt;continue&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;Dir o:\thisdoesnotexist&lt;br /&gt;1&lt;span class="op"&gt;/&lt;/span&gt;&lt;span class="var"&gt;$null&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$ErrorActionPreference&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$oldsetting&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;So you can make a trap specific for a certain type of exception by adding the exception type in square brackets right after the trap statement.&lt;/p&gt;
&lt;h2&gt;Understanding Scope&lt;/h2&gt;
&lt;p&gt;Whenever an error occurs and your trap is called, once your trap code is done life continues. PowerShell continues with the next statement in the scope of your trap. If you only have one scope, PowerShell will therefore continue with the next statement following your error:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; { &lt;span class="string"&gt;&amp;#39;An Error Occured!&amp;#39;&lt;/span&gt;; &lt;span class="keyword"&gt;continue&lt;/span&gt; }&lt;br /&gt;&lt;span class="string"&gt;&amp;#39;Hello&amp;#39;&lt;/span&gt;&lt;br /&gt;1&lt;span class="op"&gt;/&lt;/span&gt;&lt;span class="var"&gt;$null&lt;/span&gt;&lt;br /&gt;&lt;span class="string"&gt;&amp;#39;World&amp;#39;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Often, sets of commands should work as groups, and if something goes wrong, the remaining commands of that group should be omitted. That&amp;#39;s easy once you group them by scope. You could add functions to do that but the easiest way is to use plain script blocks. Just don&amp;#39;t forget to invoke the script block using &amp;quot;&amp;amp;&amp;quot; or &amp;quot;.&amp;quot;:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; { &lt;span class="string"&gt;&amp;#39;An Error Occured!&amp;#39;&lt;/span&gt;; &lt;span class="keyword"&gt;continue&lt;/span&gt; }&lt;br /&gt;&lt;span class="op"&gt;&amp;amp;&lt;/span&gt; { &lt;span class="string"&gt;&amp;#39;Hello&amp;#39;&lt;/span&gt;&lt;br /&gt;1&lt;span class="op"&gt;/&lt;/span&gt;&lt;span class="var"&gt;$null&lt;/span&gt;&lt;br /&gt;&lt;span class="string"&gt;&amp;#39;World&amp;#39;&lt;/span&gt;}&lt;br /&gt;&lt;span class="string"&gt;&amp;#39; This is outside the scope&amp;#39;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;When you run this, once the error occurs all remaining commands in your script block are omitted, and the script continues with the next statement outside the script block.&lt;/p&gt;
&lt;h2&gt;Raising Exceptions&lt;/h2&gt;
&lt;p&gt;You can also raise exceptions which is a good way of writing flexible code because by raising exceptions you leave it to error handlers like Trap how to respond to the error. To raise an exception, use Throw and specify the kind of error you would like to generate. Then, leave it to others to pick up and handle your error. If noone handles it, PowerShell will eventually handle it and display a red error message:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;Throw (&lt;span class="verbnoun"&gt;New-Object&lt;/span&gt; &lt;span class="namespace"&gt;System.Management.Automation.RuntimeException&lt;/span&gt;)&lt;div class="output"&gt;&lt;span class="error"&gt;System Error.&lt;br /&gt;At Line:1 Column:6&lt;br /&gt;+ Throw  &amp;lt;&amp;lt;&amp;lt;&amp;lt; (New-Object System.Management.Automation.RuntimeException)&lt;/span&gt;&lt;/div&gt;Throw (&lt;span class="verbnoun"&gt;New-Object&lt;/span&gt; &lt;span class="namespace"&gt;System.IO.DirectoryNotFoundException&lt;/span&gt;)&lt;div class="output"&gt;&lt;span class="error"&gt;Attempted to access a path that is not on the disk.&lt;br /&gt;At Line:1 Column:6&lt;br /&gt;+ Throw  &amp;lt;&amp;lt;&amp;lt;&amp;lt; (New-Object System.IO.DirectoryNotFoundException)&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Replacing Error Messages&lt;/h2&gt;
&lt;p&gt;Maybe all you want to do is replace the standard error message with a more meaningful error message and then let PowerShell handle the error. To do that, you create an ErrorDetails object with your replacement message and assign this to the ErrorDetails property of the current error record. The following code changes the error message to a different error message:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="keyword"&gt;trap&lt;/span&gt; { &lt;br /&gt;  &lt;span class="var"&gt;$Error&lt;/span&gt;[0].&lt;span class="method"&gt;ErrorDetails&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;`&lt;/span&gt;&lt;br /&gt;  &lt;span class="verbnoun"&gt;New-Object&lt;/span&gt; &lt;span class="namespace"&gt;System.Management.Automation.ErrorDetails&lt;/span&gt; &lt;span class="keyword"&gt;`&lt;/span&gt;&lt;br /&gt;  &lt;span class="string"&gt;&amp;#39;Something really weird has happened.&amp;#39;&lt;/span&gt; &lt;br /&gt;}&lt;br /&gt;1&lt;span class="op"&gt;/&lt;/span&gt;&lt;span class="var"&gt;$null&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Note that your Trap did not handle the exception because it did not call &amp;quot;Continue&amp;quot;. Instead, it just modified the existing error record and left it to PowerShell to output the error information. Of course, in real life you would first check error details and then create a meaningful replacement message.&lt;/p&gt;
&lt;h2&gt;More Detailed Error Messages&lt;/h2&gt;
&lt;p&gt;By default, PowerShell outputs only exception messages and the positional information that helps you find out where the error occured. To get more verbose error information, you can change a number of automatic variables:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="comment"&gt;# Adds the exception class name.&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$ReportErrorShowExceptionClass&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$true&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# All inner exceptions will also be displayed. Inner exceptions are &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# exceptions that were caught by outer exceptions.&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$ReportErrorShowInnerException&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$true&lt;/span&gt; &lt;br /&gt;&lt;span class="comment"&gt;# Outputs the stack trace, telling you which internal .NET methods &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# were called immediately before the error occured.&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$ReportErrorShowStackTrace&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$true&lt;/span&gt; &lt;br /&gt;&lt;span class="comment"&gt;#If you&amp;#39;d like to see less information, you can change &lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$ReportErrorShowSource&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$false&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2&gt;Custom Colors for Error Messages&lt;/h2&gt;
&lt;p&gt;By default, PowerShell displays error messages in red on black background. Depending on your other color settings, error messages might not be readable so you can change error message colors like this:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="var"&gt;$Host&lt;/span&gt;.&lt;span class="namespace"&gt;PrivateData.ErrorForegroundColor&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;Red&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$Host&lt;/span&gt;.&lt;span class="namespace"&gt;PrivateData.ErrorBackgroundColor&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;White&amp;#39;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Have fun!&lt;/p&gt;
&lt;p&gt;-Tobias&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=30" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Error+Message/default.aspx">Error Message</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/ErrorDetails/default.aspx">ErrorDetails</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Throw/default.aspx">Throw</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Trap/default.aspx">Trap</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Stacktrace/default.aspx">Stacktrace</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Catch/default.aspx">Catch</category></item></channel></rss>