Michael Maddison
michael at ddisolutions.com.au
Fri Jul 23 00:19:57 CDT 2010
Hi John, Check out NLog for your logging requirements. It is comprehensive and free. http://nlog-project.org/ It will write logs to just about anywhere including SQL. My take on error handling in.net is to 1st Avoid exceptions ie test for null before using the object. 2nd Use supplied methods to avoid exceptions ie If !File.Exists("C:\test.txt") ... 3rd Use supplied object exceptions ie Catch ( FileNotFound e) You will know what errors you can recover from and what is fatal to your application. Unhandled exceptions bubble up to a handler, if there is no handler it will throw an error in your Main sub. You can catch unhandled errors there, including threading errors. This is how I handled unhandled thread exceptions, with logging, in a recent app. /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main ( ) { Application.ThreadException += new ThreadExceptionEventHandler ( Application_ThreadException ); bool createdNew = true; using ( Mutex mutex = new Mutex ( true, "EZHL7", out createdNew ) ) { if ( createdNew ) { Application.EnableVisualStyles ( ); Application.SetCompatibleTextRenderingDefault ( false ); Application.Run ( new FormMain ( ) ); } } } static void Application_ThreadException ( object sender, ThreadExceptionEventArgs e ) { Logger logger = MyLogManager.Instance.GetCurrentClassLogger ( ); logger.FatalException ( "Unhandled Thread Error!", e.Exception ); Application.Restart ( ); } HTH Cheers Michael M PS Looking at the subject line, yes you can create your own custom errors for your custom classes. -----Original Message----- From: dba-vb-bounces at databaseadvisors.com [mailto:dba-vb-bounces at databaseadvisors.com] On Behalf Of jwcolby Sent: Friday, 23 July 2010 2:37 PM To: VBA Subject: [dba-VB] C# custom exceptions I am trying to find info on how and when where and why to use custom exceptions and particularly how to log them. I am developing a system which uses four asynchronous processes. Stage 1) Export a SQL table or view to address validation. I have a table that has records which tell stage 1 the name of the database, view to export, date to process, directory on disk and a few other things. Stage 1 creates text files on disk in a staging directory, one file for each 2 million records exported. This creates a record in a log table with the PK of stage 1 table, name of the database, view exported, directory on disk (output staging directory), file name, and some date flags to monitor completion of the remaining stages. IOW one log file per text file exported, all info needed for the remaining stages, date fields for each remaining stage to log that it processed that file. Stage 2) Move the files in the staging directory to a virtual machine. The log files created by stage 1 are read and used to move the files and set a datetime flag in the log record saying that stage 2 completed (the file moved to VM). The virtual machine may not be available, but if it is the file moves and the log record is updated. If the file goes to the VM, the VM will process the file and place it in an output directory. This will take between 1/2 hour and 1 hour per file. Stage 3) Move the completed files from the VM back to a different (input) staging directory. Again, the log file is used to determine what files should be available on the VM and if found and moved, a datetime flag is set saying that file was moved back from the VM back to the Input Staging Directory. Stage 4) Import the files from the input staging directory back into SQL server. The log record for any file moved back in is marked with a datetime flag saying that the file was imported back in to SQL server. I have about a dozen or so "data" tables which have to be processed monthly, rain or shine. By placing records in the stage 1 source table, I can cause the system to process each of my data tables. As the process finishes, it creates a new record adding a "number of days to next process" to the date so that it is queued to process again in X days. I also have orders that I run that will write one or more records into this same table and cause their data to process. So... nicely divided, asynchronous process: Sql to Staging, Staging to VM, VM to staging, Staging in to SQL Server. These things must be asynchronous because the VM may or may not be available, and it is critical that each file is processed through each stage and tracked. Records in the main table triggers the process (stage 1). Records in the log table track stages 2-4 for each file created in stage 1. I want to run 4 threads to do these processes. IOW, a process just runs on the server (or somewhere, but probably eventually on the server). Each stage is entirely independent, and takes its input from a table, and writes a datetime flag as it finishes. OK, so back to exceptions... I am new to threads. I wrote the code from the bottom up, with working processes for doing each of the 4 stages, but triggered by button clicks. It all worked, except that it wasn't table driven (of course). I even had each button click create a worker thread and that worked. I created a supervisor class, with four methods, one for each stage. I moved the button click code to these methods. I fired each of them up, and it mostly works... each stage is running in its own thread and watching the tables, updating the records as each does its thing. Except that I would get weird errors that were not handled by any exception handler. I removed all traces of messagebox.show and I *think* I have caused that to go away. Or maybe not, who knows. But now I really need to get errors logged. Again, I am new to threading, and new to custom exceptions. New to exception logging. Do I sound like a nubee? ;) Anyway, I do not particularly want to use the Windows error log because then the error logs would be scattered around on whatever machine the parts run on. Remember that there is a user interface part which sets up the records in stage 1 and monitors the process. This is potentially a nice little system but it has to be done right or I will fight it for the rest of my career. So I need to learn exceptions, and I need to log the exceptions, my preference is into SQL Server, though there are of course some potential errors (SQL server errors) which could not be logged there because SQL server isn't available at the instant the log is created. Kinda messy. Any pointers, articles, books, or other sources of information I could go to to learn this stuff. Google is not my friend in this case because I am getting stuff from 2003 to the present and I really want modern code. Help! -- John W. Colby www.ColbyConsulting.com _______________________________________________ dba-VB mailing list dba-VB at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/dba-vb http://www.databaseadvisors.com