/* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110 */ /* Example13_9.cs illustrates a custom exception */ using System; // declare the CustomException class class CustomException : ApplicationException { public CustomException(string Message) : base(Message) { // set the HelpLink and Source properties this.HelpLink = "See the Readme.txt file"; this.Source = "My Example13_9 Program"; } } public class Example13_9 { public static void Main() { try { // throw a new CustomException object Console.WriteLine("Throwing a new CustomException object"); throw new CustomException("My CustomException message"); } catch (CustomException e) { // display the CustomException object's properties Console.WriteLine("HelpLink = " + e.HelpLink); Console.WriteLine("Message = " + e.Message); Console.WriteLine("Source = " + e.Source); Console.WriteLine("StackTrace = " + e.StackTrace); Console.WriteLine("TargetSite = " + e.TargetSite); } } }
Language Basics
Exception handle with your own exception class
/* Learning C# by Jesse Liberty Publisher: O'Reilly ISBN: 0596003765 */ using System; namespace ExceptionHandling { // custom exception class class MyCustomException : System.ApplicationException { public MyCustomException(string message): base(message) // pass the message up to the base class { } } public class TesterExceptionHandling { public void Run() { try { Console.WriteLine("Open file here"); double a = 0; double b = 5; Console.WriteLine ("{0} / {1} = {2}", a, b, DoDivide(a,b)); Console.WriteLine ( "This line may or may not print"); } // most derived exception type first catch (System.DivideByZeroException e) { Console.WriteLine( " DivideByZeroException! Msg: {0}", e.Message); Console.WriteLine( " HelpLink: {0} ", e.HelpLink); } // catch custom exception catch (MyCustomException e) { Console.WriteLine( " MyCustomException! Msg: {0}", e.Message); Console.WriteLine( " HelpLink: {0} ", e.HelpLink); } catch // catch any uncaught exceptions { Console.WriteLine( "Unknown exception caught"); } finally { Console.WriteLine ("Close file here."); } } // do the division if legal public double DoDivide(double a, double b) { if (b == 0) { DivideByZeroException e = new DivideByZeroException(); e.HelpLink= "http://www.libertyassociates.com"; throw e; } if (a == 0) { // create a custom exception instance MyCustomException e = new MyCustomException( "Can't have zero divisor"); e.HelpLink = "http://www.libertyassociates.com/NoZeroDivisor.htm"; throw e; } return a/b; } static void Main() { Console.WriteLine("Enter Main..."); TesterExceptionHandling t = new TesterExceptionHandling(); t.Run(); Console.WriteLine("Exit Main..."); } } }
Shows how multiple objects may subscribe to the same event
/* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794 */ // Subscrib.cs -- Shows how multiple objects may subscribe to the same // event. // // Compile this program with the following command line: // C:>csc Subscrib.cs using System; namespace nsEvents { public class Subscrib { // Declare an instance of the clsDelegate class. The event variable // is not static. static public clsDelegate dlg = new clsDelegate (); static public void Main () { // Add clsMain to the event list dlg.DoEvent += new clsDelegate.StringHandler (ShowEvent); // Create subscribers for the event clsSubscriber sub = new clsSubscriber (); clsNextSubscriber sub2 = new clsNextSubscriber (); // Fire the event. dlg.FireEvent ("Fired from Main()"); } static public void ShowEvent (string str) { Console.WriteLine ("Main handled event: " + str); } } public class clsDelegate { // Declare a delegate for the event public delegate void StringHandler (string str); // A variable to hold the delegate public event StringHandler DoEvent; // This method will trigger the event. public void FireEvent (string str) { if (DoEvent != null) DoEvent (str); } } public class clsSubscriber { public clsSubscriber () { Subscrib.dlg.DoEvent += new clsDelegate.StringHandler (SubscribeEvent); } public void SubscribeEvent (string str) { Console.WriteLine ("Subscriber handled event: " + str); } } public class clsNextSubscriber { public clsNextSubscriber () { Subscrib.dlg.DoEvent += new clsDelegate.StringHandler (SubscribeEvent); } public void SubscribeEvent (string str) { Console.WriteLine ("Next Subscriber handled event: " + str); } } }
Demonstrate passing an object to an event handler and performing the proper cast in the method
/* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794 */ // ObjEvent.cs -- Demonstrate passing an object to an event handler and // performing the proper cast in the method. // // Compile this program with the following command line: // C:>csc ObjEvent.cs using System; namespace nsEvents { public class ObjEvent1 { public delegate void EventHandler (object obj); public event EventHandler EvInvoke; public void FireEvent (object obj) { if (obj != null) EvInvoke (obj); } static public void Main () { ObjEvent1 main = new ObjEvent1 (); main.EvInvoke = new ObjEvent1.EventHandler (ObjEvent); main.FireEvent (42); main.FireEvent (42.0); } static void ObjEvent (object obj) { if (obj is double) { Console.WriteLine ("Received a double object: " + (double) obj); } else if (obj is int) { Console.WriteLine ("Received an int object: " + (int) obj); } } } }
illustrates the use of an event
/* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110 */ /* Example12_4.cs illustrates the use of an event */ using System; // declare the MeltdownEventArgs class (implements EventArgs) class MeltdownEventArgs : EventArgs { // declare a private field named message private string message; // define a constructor public MeltdownEventArgs(string message) { this.message = message; } // define a property to get the message public string Message { get { return message; } } } // declare the Reactor class class Reactor { // declare a private field named temperature private int temperature; // declare a delegate class named MeltdownHandler public delegate void MeltdownHandler( object reactor, MeltdownEventArgs myMEA ); // declare an event named OnMeltdown public event MeltdownHandler OnMeltdown; // define a property to set the temperature public int Temperature { set { temperature = value; // if the temperature is too high, the reactor melts down if (temperature > 1000) { MeltdownEventArgs myMEA = new MeltdownEventArgs("Reactor meltdown in progress!"); OnMeltdown(this, myMEA); } } } } // declare the ReactorMonitor class class ReactorMonitor { // define a constructor public ReactorMonitor(Reactor myReactor) { myReactor.OnMeltdown += new Reactor.MeltdownHandler(DisplayMessage); } // define the DisplayMessage() method public void DisplayMessage( object myReactor, MeltdownEventArgs myMEA ) { Console.WriteLine(myMEA.Message); } } public class Example12_4 { public static void Main() { // create a Reactor object Reactor myReactor = new Reactor(); // create a ReactorMonitor object ReactorMonitor myReactorMonitor = new ReactorMonitor(myReactor); // set myReactor.Temperature to 100 degrees Centigrade Console.WriteLine("Setting reactor temperature to 100 degrees Centigrade"); myReactor.Temperature = 100; // set myReactor.Temperature to 500 degrees Centigrade Console.WriteLine("Setting reactor temperature to 500 degrees Centigrade"); myReactor.Temperature = 500; // set myReactor.Temperature to 2000 degrees Centigrade // (this causes the reactor to meltdown) Console.WriteLine("Setting reactor temperature to 2000 degrees Centigrade"); myReactor.Temperature = 2000; } }
Calling Native DLL Functions
/* A Programmer's Introduction to C# (Second Edition) by Eric Gunnerson Publisher: Apress L.P. ISBN: 1-893115-62-3 */ // 31 - InteropCalling Native DLL Functions // copyright 2000 Eric Gunnerson using System.Runtime.InteropServices; public class CallingNativeDLLFunctions { [DllImport("user32.dll")] public static extern int MessageBox(int h, string m, string c, int type); public static void Main() { int retval = MessageBox(0, "Hello", "Caption", 0); } }
Creates a library assembly
/* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110 */ /* Example16_2.cs creates a library assembly */ // compile with: csc /target:library Example16_2.cs using System; using System.Reflection; using System.Windows.Forms; [assembly:AssemblyVersionAttribute("1.0.0.0")] [assembly:AssemblyTitleAttribute("Example 16.2")] public class Example16_2 { string privateString; public string inString { get { return privateString; } set { privateString = inString; } } public void upper(out string upperString) { upperString = privateString.ToUpper(); } }