Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: sdk/lib/core/errors.dart

Issue 711003002: Add some ArgumentError and RangeError constructors that capture more information. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sdk/lib/convert/ascii.dart ('k') | sdk/lib/core/string.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of dart.core; 5 part of dart.core;
6 6
7 /** 7 /**
8 * Error objects thrown in the case of a program failure. 8 * Error objects thrown in the case of a program failure.
9 * 9 *
10 * An `Error` object represents a program failure that the programmer 10 * An `Error` object represents a program failure that the programmer
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 * Error thrown when attempting to throw [:null:]. 152 * Error thrown when attempting to throw [:null:].
153 */ 153 */
154 class NullThrownError extends Error { 154 class NullThrownError extends Error {
155 String toString() => "Throw of null."; 155 String toString() => "Throw of null.";
156 } 156 }
157 157
158 /** 158 /**
159 * Error thrown when a function is passed an unacceptable argument. 159 * Error thrown when a function is passed an unacceptable argument.
160 */ 160 */
161 class ArgumentError extends Error { 161 class ArgumentError extends Error {
162 /** Whether value was provided. */
163 final bool _hasValue;
164 /** The invalid value. */
165 final invalidValue;
166 /** Name of the invalid argument, if available. */
167 final String name;
168 /** Message describing the problem. */
162 final message; 169 final message;
163 170
164 /** The [message] describes the erroneous argument. */ 171 /**
165 ArgumentError([this.message]); 172 * The [message] describes the erroneous argument.
173 *
174 * Existing code may be using `message` to hold the invalid value.
175 * If the `message` is not a [String], it is assumed to be a value instead
176 * of a message.
177 */
178 ArgumentError([this.message])
179 : invalidValue = null,
180 _hasValue = false,
181 name = null;
182
183 /**
184 * Creates error containing the invalid [value].
185 *
186 * A message is built by suffixing the [message] argument with
187 * the [name] argument (if provided) and the value. Example
188 *
189 * "Invalid argument (foo): null"
190 *
191 * The `name` should match the argument name of the function, but if
192 * the function is a method implementing an interface, and its argument
193 * names differ from the interface, it might be more useful to use the
194 * interface method's argument name (or just rename arguments to match).
195 */
196 ArgumentError.value(value,
197 [String this.name,
198 String this.message = "Invalid argument"])
199 : invalidValue = value,
200 _hasValue = true;
201
202 /**
203 * Create an argument error for a `null` argument that must not be `null`.
204 *
205 * Shorthand for calling [ArgumentError.value] with a `null` value and a
206 * message of `"Must not be null"`.
207 */
208 ArgumentError.notNull([String name])
209 : this.value(null, name, "Must not be null");
166 210
167 String toString() { 211 String toString() {
168 if (message != null) { 212 if (!_hasValue) {
169 return "Illegal argument(s): $message"; 213 if (message != null) {
214 return "Invalid argument(s): $message";
215 }
216 return "Invalid argument(s)";
170 } 217 }
171 return "Illegal argument(s)"; 218 String nameString = "";
219 if (name != null) {
220 nameString = " ($name)";
221 }
222 return "$message$nameString: ${Error.safeToString(invalidValue)}";
172 } 223 }
173 } 224 }
174 225
175 /** 226 /**
176 * Error thrown due to an index being outside a valid range. 227 * Error thrown due to an index being outside a valid range.
177 */ 228 */
178 class RangeError extends ArgumentError { 229 class RangeError extends ArgumentError {
230 /** The value that is outside its valid range. */
231 final num invalidValue;
232 /** The minimum value that [value] is allowed to assume. */
233 final num start;
234 /** The maximum value that [value] is allowed to assume. */
235 final num end;
236
179 // TODO(lrn): This constructor should be called only with string values. 237 // TODO(lrn): This constructor should be called only with string values.
180 // It currently isn't in all cases. 238 // It currently isn't in all cases.
181 /** 239 /**
182 * Create a new [RangeError] with the given [message]. 240 * Create a new [RangeError] with the given [message].
183 */ 241 */
184 RangeError(var message) : super(message); 242 RangeError(var message)
243 : invalidValue = null, start = null, end = null, super(message);
185 244
186 /** Create a new [RangeError] with a message for the given [value]. */ 245 /** Create a new [RangeError] with a message for the given [value]. */
187 RangeError.value(num value) : super("value $value"); 246 RangeError.value(num value, [String message = "Value not in range"])
247 : invalidValue = value, start = null, end = null,
248 super(message);
188 249
189 /** 250 /**
190 * Create a new [RangeError] with a message for a value and a range. 251 * Create a new [RangeError] with for an invalid value being outside a range.
191 * 252 *
192 * The allowed range is from [start] to [end], inclusive. 253 * The allowed range is from [start] to [end], inclusive.
254 * If `start` or `end` are `null`, the range is infinite in that direction.
255 *
256 * For a range from 0 to the length of something, end exclusive, use
257 * [RangeError.index].
193 */ 258 */
194 RangeError.range(num value, num start, num end) 259 RangeError.range(this.invalidValue, this.start, this.end,
195 : super("value $value not in range $start..$end"); 260 [String message = "Invalid value"]) : super(message);
196 261
197 String toString() => "RangeError: $message"; 262 /**
263 * Creates a new [RangeError] stating that [index] is not a valid index
264 * into [indexable].
265 *
266 * The [length] is the length of [indexable] at the time of the error.
267 * If `length` is omitted, it defaults to `indexable.length`.
268 *
269 * The message is used as part of the string representation of the error.
270 */
271 factory RangeError.index(int index, indexable,
272 [String message,
273 int length]) = IndexError;
sra1 2014/11/11 22:04:11 Doesn't this forwarding incorrectly store the inde
Lasse Reichstein Nielsen 2014/11/12 07:38:06 Yes, fixed in follow-up CL. Only Dart2js actually
274
275 String toString() {
276 if (invalidValue == null) return "$message";
277 String value = Error.safeToString(invalidValue);
278 if (start == null) {
279 if (end == null) {
280 return "$message ($value)";
281 }
282 return "$message ($value): Value must be less than or equal to $end";
283 }
284 if (end == null) {
285 return "$message ($value): Value must be greater than or equal to $start";
286 }
287 if (end > start) {
288 return "$message ($value): Value must be in range $start..$end, "
289 "inclusive.";
290 }
291 if (end < start) return "$message ($value): Valid range is empty";
292 return "$message ($value): Only valid value is $start";
293 }
294 }
295
296 /**
297 * A specialized [RangeError] used when an index is not in the range
298 * `0..indexable.length-1`.
299 *
300 * Also contains the indexable object, its length at the time of the error,
301 * and the invalid index itself.
302 */
303 class IndexError extends ArgumentError implements RangeError {
304 /** The indexable object that [index] was not a valid index into. */
305 final indexable;
306 /** The invalid index. */
307 final int invalidValue;
sra1 2014/11/11 22:04:11 This field shadows the field of the same name in A
Lasse Reichstein Nielsen 2014/11/12 07:38:06 Yes, this is silly. Using implements ArgumentError
308 /** The length of [indexable] at the time of the error. */
309 final int length;
310
311 /**
312 * Creates a new [IndexError] stating that [invalidValue] is not a valid index
313 * into [indexable].
314 *
315 * The [length] is the length of [indexable] at the time of the error.
316 * If `length` is omitted, it defaults to `indexable.length`.
317 *
318 * The message is used as part of the string representation of the error.
319 */
320 IndexError(indexable, this.invalidValue,
321 [String message = "Index out of range", int length])
322 : this.indexable = indexable,
323 this.length = (length != null) ? length : indexable.length,
324 super(message);
325
326 // Getters inherited from RangeError.
327 int get start => 0;
328 int get end => length - 1;
329
330 String toString() {
331 String target = Error.safeToString(indexable);
332 if (invalidValue < 0) {
333 return "RangeError: $message ($target[$invalidValue]): "
334 "index must not be negative.";
335 }
336 return "RangeError: $message: ($target[$invalidValue]): "
337 "index should be less than $length.";
338 }
198 } 339 }
199 340
200 341
201 /** 342 /**
202 * Error thrown when control reaches the end of a switch case. 343 * Error thrown when control reaches the end of a switch case.
203 * 344 *
204 * The Dart specification requires this error to be thrown when 345 * The Dart specification requires this error to be thrown when
205 * control reaches the end of a switch case (except the last case 346 * control reaches the end of a switch case (except the last case
206 * of a switch) without meeting a break or similar end of the control 347 * of a switch) without meeting a break or similar end of the control
207 * flow. 348 * flow.
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 * the first time it is read. If evaluating the initializer expression causes 499 * the first time it is read. If evaluating the initializer expression causes
359 * another read of the variable, this error is thrown. 500 * another read of the variable, this error is thrown.
360 */ 501 */
361 class CyclicInitializationError extends Error { 502 class CyclicInitializationError extends Error {
362 final String variableName; 503 final String variableName;
363 CyclicInitializationError([this.variableName]); 504 CyclicInitializationError([this.variableName]);
364 String toString() => variableName == null 505 String toString() => variableName == null
365 ? "Reading static variable during its initialization" 506 ? "Reading static variable during its initialization"
366 : "Reading static variable '$variableName' during its initialization"; 507 : "Reading static variable '$variableName' during its initialization";
367 } 508 }
OLDNEW
« no previous file with comments | « sdk/lib/convert/ascii.dart ('k') | sdk/lib/core/string.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698