Search  
Monday, May 21, 2012 ..:: Home ::.. Register  Login

Welcome to Dittenhafer.Net! We're glad you stopped by to check out our latest explorations and learn more about us. In these pages you will find details of our current and past curiosities ranging from software development and computers, to food and creative flavors. We hope you'll enjoy what you find, and encourage you to share your experiences with us also. Thanks, enjoy!

RSS for Dan's Blog...

Location: BlogsDan's Blog    
Posted by: Dan Dittenhafer 5/2/2011
For the last couple of weeks I have been required to import a data log file (CSV) from a legacy SCADA system into my centralized data management system. It occured to me today that I might be able to use PowerShell to automate some of the importing steps which include import to a DEV, QA and Production system. I'm still working on this script, but in the process of developing it, I had a need to learn more about an exception that was occuring in the script. I had my try/catch block already specified, but was simply using Write-Error, as in the following code sample, to report a generic message "Failed to..." whenever the catch block was executed.
try
{
    $session = Logon...
}
catch
{
    Write-Error "Failed to logon to DMS."
}

I searched the local PowerShell help and didn't see any info on how to get more detail about a given exception. I searched a little online including about_Try_Catch_Finally and didn't find any gems. Then I thought "Maybe there is a global object, like $host, that as some error info". I tried $Err and $Error with no success... then I tried $_ and surprise! It resulted in an object with exception details! See the code sample below, where the $_ object is used in the catch block and converted to a string for output to the Write-Error stream.
try
{
    $session = Logon...
}
catch
{
    # Using $_ in the catch block to include more details about the error that occured.
    Write-Error ("Failed to logon to DMS." + $_)
}

When run through Get-Member, the $_ object in the catch block returns the following result:
   TypeName: System.Management.Automation.ErrorRecord

Name                  MemberType     Definition
----                  ----------     ----------
Equals                Method         bool Equals(System.Object obj)
GetHashCode           Method         int GetHashCode()
GetObjectData         Method         System.Void GetObjectData(System.Runtime.Serialization.SerializationInfo info, 
                                     System.Runtime.Serialization.StreamingContext context)
GetType               Method         type GetType()                                        
ToString              Method         string ToString()                                     
CategoryInfo          Property       System.Management.Automation.ErrorCategoryInfo CategoryInfo {get;}
ErrorDetails          Property       System.Management.Automation.ErrorDetails ErrorDetails {get;set;} 
Exception             Property       System.Exception Exception {get;}                                 
FullyQualifiedErrorId Property       System.String FullyQualifiedErrorId {get;}                        
InvocationInfo        Property       System.Management.Automation.InvocationInfo InvocationInfo {get;} 
PipelineIterationInfo Property       System.Collections.ObjectModel.ReadOnlyCollection`1[[System.Int32, mscorlib, 
                                     Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 
                                     PipelineIterationInfo {get;}
TargetObject          Property       System.Object TargetObject {get;}                             
PSMessageDetails      ScriptProperty System.Object PSMessageDetails {get=& { Set-StrictMode -Version 1; 
                                     $this.Exception.InnerException.PSMessageDetails };}

Of course, after having figured this out, I thought "Hmm... I bet others might have the same question about getting more exception detail inside a catch block", and so was born this blog entry. Hope it helps!
Permalink |  Trackback
Copyright 2007 by Daniel & Jennifer Dittenhafer   Terms Of Use  Privacy Statement