058d8787301852eab403d90ddd52ce63be0ee977
[mono.git] / mono / metadata / exception.c
1 /*
2  * exception.c: Exception handling
3  *
4  * Authors:
5  *      Paolo Molaro (lupus@ximian.com)
6  *      Dietmar Maurer (dietmar@ximian.com)
7  *      Dick Porter (dick@ximian.com)
8  *
9  * (C) 2001 Ximian, Inc.
10  */
11
12 #include <mono/metadata/exception.h>
13 #include <mono/metadata/class.h>
14 #include <mono/metadata/appdomain.h>
15
16 MonoException *
17 mono_exception_from_name (MonoImage *image, const char *name_space,
18                           const char *name)
19 {
20         MonoDomain *domain = mono_domain_get ();
21         MonoClass *klass;
22         MonoObject *o;
23
24         klass = mono_class_from_name (image, name_space, name);
25
26         o = mono_object_new (domain, klass);
27         g_assert (o != NULL);
28         
29         mono_runtime_object_init (o);
30
31         return (MonoException *)o;
32 }
33
34 MonoException *
35 mono_get_exception_divide_by_zero ()
36 {
37         return mono_exception_from_name (mono_defaults.corlib, "System",
38                                          "DivideByZeroException");
39 }
40
41 MonoException *
42 mono_get_exception_security ()
43 {
44         return mono_exception_from_name (mono_defaults.corlib, "System",
45                                          "SecurityException");
46 }
47
48 MonoException *
49 mono_get_exception_arithmetic ()
50 {
51         return mono_exception_from_name (mono_defaults.corlib, "System",
52                                          "ArithmeticException");
53 }
54
55 MonoException *
56 mono_get_exception_overflow ()
57 {
58         return mono_exception_from_name (mono_defaults.corlib, "System",
59                                          "OverflowException");
60 }
61
62 MonoException *
63 mono_get_exception_null_reference ()
64 {
65         return mono_exception_from_name (mono_defaults.corlib, "System",
66                                          "NullReferenceException");
67 }
68
69 MonoException *
70 mono_get_exception_execution_engine ()
71 {
72         return mono_exception_from_name (mono_defaults.corlib, "System",
73                                          "ExecutionEngineException");
74 }
75
76 MonoException *
77 mono_get_exception_invalid_cast ()
78 {
79         return mono_exception_from_name (mono_defaults.corlib, "System",
80                                          "InvalidCastException");
81 }
82
83 MonoException *
84 mono_get_exception_index_out_of_range ()
85 {
86         return mono_exception_from_name (mono_defaults.corlib, "System",
87                                          "IndexOutOfRangeException");
88 }
89
90 MonoException *
91 mono_get_exception_array_type_mismatch ()
92 {
93         return mono_exception_from_name (mono_defaults.corlib, "System",
94                                          "ArrayTypeMismatchException");
95 }
96
97 MonoException *
98 mono_get_exception_type_load ()
99 {
100         return mono_exception_from_name (mono_defaults.corlib, "System",
101                                          "TypeLoadException");
102 }
103
104 MonoException *
105 mono_get_exception_not_implemented ()
106 {
107         return mono_exception_from_name (mono_defaults.corlib, "System",
108                                          "NotImplementedException");
109 }
110
111 MonoException *
112 mono_get_exception_missing_method ()
113 {
114         return mono_exception_from_name (mono_defaults.corlib, "System",
115                                          "MissingMethodException");
116 }
117
118 MonoException*
119 mono_get_exception_argument_null (MonoDomain *domain, const guchar *arg)
120 {
121         MonoException *ex;
122
123         ex = (MonoException *)mono_exception_from_name ( 
124                 mono_defaults.corlib, "System", "ArgumentNullException");
125
126         if (arg)
127                 ((MonoArgumentException *)ex)->param_name =
128                         mono_string_new (domain, arg);
129         
130         return ex;
131 }
132
133 MonoException *
134 mono_get_exception_argument (MonoDomain *domain, const guchar *arg, const guchar *msg)
135 {
136         MonoException *ex;
137
138         ex = (MonoException *)mono_exception_from_name (
139                 mono_defaults.corlib, "System", "ArgumentException");
140
141         if (msg)
142                 ex->message = mono_string_new (domain, msg);
143         
144         if (arg)
145                 ((MonoArgumentException *)ex)->param_name =
146                         mono_string_new (domain, arg);
147         
148         return ex;
149 }
150
151 MonoException *
152 mono_get_exception_io (MonoDomain *domain, const guchar *msg)
153 {
154         MonoException *ex;
155
156         ex=(MonoException *)mono_exception_from_name ( 
157                 mono_defaults.corlib, "System.IO", "IOException");
158
159         ex->message=mono_string_new (domain, msg);
160         
161         return(ex);
162 }
163
164