473,320 Members | 2,048 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 software developers and data experts.

Howto Identify an Exception?

Hi,

For some procedures that throws exceptions, I would like to show different
messages to the user depending on what type of exception he's getting. For
instance this one: when the file is locked, I want a messagebox to tell that
the user has to close the file first.

Is there a way to identify an exception by some kind of unique number or
something like this? I don't want to identify it on the Exception Message
because some users are using French OS, and it'sj sutn ot right in my
opinion :-)

Thanks a lot in advance,

Pieter

Exemple of the exception:
Exception Source: mscorlib
Exception Type: System.IO.IOException
Exception Message: The process cannot access the file 'C:\Documents and
Settings\LBN\Desktop\Proforma.xls' because it is being used by another
process.
Exception Target Site: WinIOError

---- Stack Trace ----
System.IO.__Error.WinIOError(errorCode As Int32, maybeFullPath As String)
Ghost.exe: N 2015149
System.IO.FileStream.Init(path As String, mode As FileMode, access As
FileAccess, rights As Int32, useRights As Boolean, share As FileShare,
bufferSize As Int32, options As FileOptions, secAttrs As
SECURITY_ATTRIBUTES, msgPath As String, bFromProxy As Boolean)
Ghost.exe: N 00998
System.IO.FileStream..ctor(path As String, mode As FileMode, access As
FileAccess)
Ghost.exe: N 00057
System.Windows.Forms.SaveFileDialog.OpenFile()
Ghost.exe: N 00154
Microsoft.Reporting.WinForms.ExportDialog.PromptFi leName(fileExtension As
String)
Ghost.exe: N 00369
Microsoft.Reporting.WinForms.ExportDialog.OnExport CompleteUI(result As
ProcessThreadResult, data As Object)
Ghost.exe: N 00116
Nov 16 '06 #1
6 1205
Why not use the standard try catch blocks?

i.e.

Try
' Whatever
Catch ex as InvalidOperatationException
msgbox(" Invalid Op!")
Catch ex as FileIOException
msgbox("File IO Exception!")
Catch ex as Exception
' Grabs all the other exception (well, for the most part)
msgbox(ex.message)
End Try

Thanks,

Seth Rowe

Pieter wrote:
Hi,

For some procedures that throws exceptions, I would like to show different
messages to the user depending on what type of exception he's getting. For
instance this one: when the file is locked, I want a messagebox to tell that
the user has to close the file first.

Is there a way to identify an exception by some kind of unique number or
something like this? I don't want to identify it on the Exception Message
because some users are using French OS, and it'sj sutn ot right in my
opinion :-)

Thanks a lot in advance,

Pieter

Exemple of the exception:
Exception Source: mscorlib
Exception Type: System.IO.IOException
Exception Message: The process cannot access the file 'C:\Documents and
Settings\LBN\Desktop\Proforma.xls' because it is being used by another
process.
Exception Target Site: WinIOError

---- Stack Trace ----
System.IO.__Error.WinIOError(errorCode As Int32, maybeFullPath As String)
Ghost.exe: N 2015149
System.IO.FileStream.Init(path As String, mode As FileMode, access As
FileAccess, rights As Int32, useRights As Boolean, share As FileShare,
bufferSize As Int32, options As FileOptions, secAttrs As
SECURITY_ATTRIBUTES, msgPath As String, bFromProxy As Boolean)
Ghost.exe: N 00998
System.IO.FileStream..ctor(path As String, mode As FileMode, access As
FileAccess)
Ghost.exe: N 00057
System.Windows.Forms.SaveFileDialog.OpenFile()
Ghost.exe: N 00154
Microsoft.Reporting.WinForms.ExportDialog.PromptFi leName(fileExtension As
String)
Ghost.exe: N 00369
Microsoft.Reporting.WinForms.ExportDialog.OnExport CompleteUI(result As
ProcessThreadResult, data As Object)
Ghost.exe: N 00116
Nov 16 '06 #2
Pieter wrote:
Is there a way to identify an exception by some kind of unique number or
something like this?
I may be wrong but I don't believe there's a way to do this. You
could try calling the Win32 method GetLastError() but I don't think
there's any guarantee that it wasn't reset to something else
between the file access and when you got the exception.

This is a nice concept but personally I've never found this type of
error handling that useful plus it can be time consuming and difficult
to keep up with all of the lower level error codes that may come back.
In addition it may be so far removed from your original request that
it's impossible disambiguate between multiple scenarios. What if
some virus scanner is holding on to a lock to that file and when the
user tries to open it your message tells them to close it. Then
they'll just get annoyed with your app because they don't have it
open. That later will just get them annoyed with windows in general
- which is always better.
Personally I feel that higher level processes should provide more
general type errors. For example just a "Failed to open file" with
the option to look at the details which would be "The process cannot
access the file 'C:\Documents and
Settings\LBN\Desktop\Proforma.xls' because it is being used by another
process."

Nov 16 '06 #3

rowe_newsgroups wrote:
Why not use the standard try catch blocks?
I thought that he was trying to distinguish between multliple
exceptions that may all be of the type IOException since there aren't
exception classes for every type of error.

Nov 16 '06 #4
I want indeed try to distinguish, but it could alreaddy be a start.
Thansk guys!

"Israel" <is**********@hotmail.comwrote in message
news:11*********************@e3g2000cwe.googlegrou ps.com...
>
rowe_newsgroups wrote:
>Why not use the standard try catch blocks?

I thought that he was trying to distinguish between multliple
exceptions that may all be of the type IOException since there aren't
exception classes for every type of error.

Nov 16 '06 #5

"Pieter" <pi****************@hotmail.comwrote in message
news:eU**************@TK2MSFTNGP02.phx.gbl...
Hi,

For some procedures that throws exceptions, I would like to show different
messages to the user depending on what type of exception he's getting. For
instance this one: when the file is locked, I want a messagebox to tell
that the user has to close the file first.

Is there a way to identify an exception by some kind of unique number or
something like this? I don't want to identify it on the Exception Message
because some users are using French OS, and it'sj sutn ot right in my
opinion :-)

Thanks a lot in advance,

Pieter
You should handle exceptions you know about explicitly. If you expect you
might get a general error (i.e. an error you don't know about or didn't
think about), then you catch it with a standard "catch all". It is often
useful to put the catch all exception handler as a top level handler in your
main method, especially if you intend to terminate the program when it
happens:

Now as for your French users, in general users won't have a clue what the
exception message returned means, no clue whatsoever, even the English
speaking ones (most of them actually) especially in the context of your
running program, so there is no need to provide translations of those
messages at all. What you DO need to do, is to provide some kind of message
box/logging facility so the user can at least copy the message to the
clip-board to send to your support.

In the general case, my software operates with different error levels, the
highest is "Exception" (SystemFatal), given that if I don't know what the
error is, I have no confidence that the software can continue without
borking up something else. For example:

Public Enum ErrorClassEnum

OK ' Success
Fail 'In a multiple iteration operation, fail the iteration, not the
whole operation
Fatal 'Terminate the entire operation
SystemFatal 'Terminate the program
Cancel 'Terminate the entire operation, don't display an error message

End Enum

the "Ex As Exception" is SystemFatal for me, whereas the SqlException might
be SystemFatal, Fatal or Fail, depending on what the error number is. Many
SystemFatal exceptions are caused by bad programming rather than real system
errors. For example, divison by zero, null-reference exception, etc. You
can code defensively to avoid many of these ever happening.



Nov 16 '06 #6
Pieter,

The trick is to put several individual try/catch blocks around small
blocks of code. If you need that finely-grained control, a "block" may
be a single method call. RTFM and decide what you need to catch.

For instance, on the StreamReader(string) constructor, there are 5
possible exceptions that can be thrown. Based on context, each one can
mean only one thing. Do something like:

// Get string strFilename from user.
StreamReader myStream;
try
{
myStream = new StreamReader(strFilename);
}
catch (ArgumentException)
{
// The filename string was empty.
}
catch (ArgumentNullException)
{
// The filename string was null.
}
catch (FileNotFoundException)
{
// At this point, we're sure that the filename string was valid, but
there's
// no valid file at the location it points to on the filesystem.
}
catch (DirectoryNotFoundException)
{
// At this point, we're sure that the filename string was valid, but
part
// of the path that it refers to is invalid.
}
catch (IOException)
{
// At this point, we know that the format of the filename is
incorrect.
}

Similarly, just about every operation involving any I/O has a similar
canonical exception list. See the documentation and figure out exactly
what to catch and what it means for the particular functions you need.

I believe it's bad coding style to *need* to catch all of those
exceptions in most cases. A much better way to do this is to
pre-validate (contract check) every variable. For instance, the
following code:

if (strFilename == null || strFilename == String.Empty)
// Break out: the filename is invalid

will take care of the first two exceptions. File.Exists() will tell you
if the file exists or not and save you catching the other three
exceptions. No exceptions are thrown -- throwing an exception is a
highly costly process -- and you get the same information. It also has
the added benefit of saving the exceptions for real exception cases.
For instance, if the user specifies a file, then between when you
capture the filename and when you try to do something with the file,
they unplug the USB device that the file is on, that's a real
exception. It's probably one you can't handle at the level of this
method, so it should get bubbled up to the main thread and handled
there, probably by telling the user, "you've done something I didn't
expect and can't correct."
Stephan

Pieter wrote:
Hi,

For some procedures that throws exceptions, I would like to show different
messages to the user depending on what type of exception he's getting. For
instance this one: when the file is locked, I want a messagebox to tell that
the user has to close the file first.

Is there a way to identify an exception by some kind of unique number or
something like this? I don't want to identify it on the Exception Message
because some users are using French OS, and it'sj sutn ot right in my
opinion :-)

Thanks a lot in advance,

Pieter

Exemple of the exception:
Exception Source: mscorlib
Exception Type: System.IO.IOException
Exception Message: The process cannot access the file 'C:\Documents and
Settings\LBN\Desktop\Proforma.xls' because it is being used by another
process.
Exception Target Site: WinIOError

---- Stack Trace ----
System.IO.__Error.WinIOError(errorCode As Int32, maybeFullPath As String)
Ghost.exe: N 2015149
System.IO.FileStream.Init(path As String, mode As FileMode, access As
FileAccess, rights As Int32, useRights As Boolean, share As FileShare,
bufferSize As Int32, options As FileOptions, secAttrs As
SECURITY_ATTRIBUTES, msgPath As String, bFromProxy As Boolean)
Ghost.exe: N 00998
System.IO.FileStream..ctor(path As String, mode As FileMode, access As
FileAccess)
Ghost.exe: N 00057
System.Windows.Forms.SaveFileDialog.OpenFile()
Ghost.exe: N 00154
Microsoft.Reporting.WinForms.ExportDialog.PromptFi leName(fileExtension As
String)
Ghost.exe: N 00369
Microsoft.Reporting.WinForms.ExportDialog.OnExport CompleteUI(result As
ProcessThreadResult, data As Object)
Ghost.exe: N 00116
Nov 16 '06 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

8
by: DraguVaso | last post by:
Hi, I want my application do different actions depending on the exception it gets. For exemple: I have an SQL-table with a unique index. In case I try to Insert a record that's alreaddy in it I...
11
by: Jarek | last post by:
Hi all! Is it possible to identify throw statement, within catch( ... )? Can I identify type of exception passed to catch(...) ? I'm trying to identify problem, which is probably somewhere in...
6
by: Pieter | last post by:
Hi, For some procedures that throws exceptions, I would like to show different messages to the user depending on what type of exception he's getting. For instance this one: when the file is...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
0
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.