| OLD | NEW |
| 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 * | 59 * |
| 60 * Since errors are not created to be caught, | 60 * Since errors are not created to be caught, |
| 61 * there is no need for subclasses to distinguish the errors. | 61 * there is no need for subclasses to distinguish the errors. |
| 62 * Instead subclasses have been created in order to make groups | 62 * Instead subclasses have been created in order to make groups |
| 63 * of related errors easy to create with consistent error messages. | 63 * of related errors easy to create with consistent error messages. |
| 64 * For example, the [String.contains] method will use a [RangeError] | 64 * For example, the [String.contains] method will use a [RangeError] |
| 65 * if its `startIndex` isn't in the range `0..length`, | 65 * if its `startIndex` isn't in the range `0..length`, |
| 66 * which is easily created by `new RangeError.range(startIndex, 0, length)`. | 66 * which is easily created by `new RangeError.range(startIndex, 0, length)`. |
| 67 */ | 67 */ |
| 68 class Error { | 68 class Error { |
| 69 Error(); // Prevent use as mixin. | 69 Error(); // Prevent use as mixin. |
| 70 | 70 |
| 71 /** | 71 /** |
| 72 * Safely convert a value to a [String] description. | 72 * Safely convert a value to a [String] description. |
| 73 * | 73 * |
| 74 * The conversion is guaranteed to not throw, so it won't use the object's | 74 * The conversion is guaranteed to not throw, so it won't use the object's |
| 75 * toString method. | 75 * toString method. |
| 76 */ | 76 */ |
| 77 static String safeToString(Object object) { | 77 static String safeToString(Object object) { |
| 78 if (object is num || object is bool || null == object) { | 78 if (object is num || object is bool || null == object) { |
| 79 return object.toString(); | 79 return object.toString(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 98 class AssertionError extends Error { | 98 class AssertionError extends Error { |
| 99 /** Message describing the assertion error. */ | 99 /** Message describing the assertion error. */ |
| 100 final Object message; | 100 final Object message; |
| 101 AssertionError([this.message]); | 101 AssertionError([this.message]); |
| 102 String toString() => "Assertion failed"; | 102 String toString() => "Assertion failed"; |
| 103 } | 103 } |
| 104 | 104 |
| 105 /** | 105 /** |
| 106 * Error thrown by the runtime system when a type assertion fails. | 106 * Error thrown by the runtime system when a type assertion fails. |
| 107 */ | 107 */ |
| 108 class TypeError extends AssertionError { | 108 class TypeError extends AssertionError {} |
| 109 } | |
| 110 | 109 |
| 111 /** | 110 /** |
| 112 * Error thrown by the runtime system when a cast operation fails. | 111 * Error thrown by the runtime system when a cast operation fails. |
| 113 */ | 112 */ |
| 114 class CastError extends Error { | 113 class CastError extends Error {} |
| 115 } | |
| 116 | 114 |
| 117 /** | 115 /** |
| 118 * Error thrown when attempting to throw [:null:]. | 116 * Error thrown when attempting to throw [:null:]. |
| 119 */ | 117 */ |
| 120 class NullThrownError extends Error { | 118 class NullThrownError extends Error { |
| 121 String toString() => "Throw of null."; | 119 String toString() => "Throw of null."; |
| 122 } | 120 } |
| 123 | 121 |
| 124 /** | 122 /** |
| 125 * Error thrown when a function is passed an unacceptable argument. | 123 * Error thrown when a function is passed an unacceptable argument. |
| 126 */ | 124 */ |
| 127 class ArgumentError extends Error { | 125 class ArgumentError extends Error { |
| 128 /** Whether value was provided. */ | 126 /** Whether value was provided. */ |
| 129 final bool _hasValue; | 127 final bool _hasValue; |
| 130 /** The invalid value. */ | 128 /** The invalid value. */ |
| 131 final invalidValue; | 129 final invalidValue; |
| 132 /** Name of the invalid argument, if available. */ | 130 /** Name of the invalid argument, if available. */ |
| 133 final String name; | 131 final String name; |
| 134 /** Message describing the problem. */ | 132 /** Message describing the problem. */ |
| 135 final message; | 133 final message; |
| 136 | 134 |
| 137 /** | 135 /** |
| 138 * The [message] describes the erroneous argument. | 136 * The [message] describes the erroneous argument. |
| 139 * | 137 * |
| 140 * Existing code may be using `message` to hold the invalid value. | 138 * Existing code may be using `message` to hold the invalid value. |
| 141 * If the `message` is not a [String], it is assumed to be a value instead | 139 * If the `message` is not a [String], it is assumed to be a value instead |
| 142 * of a message. | 140 * of a message. |
| 143 */ | 141 */ |
| 144 ArgumentError([this.message]) | 142 ArgumentError([this.message]) |
| 145 : invalidValue = null, | 143 : invalidValue = null, |
| 146 _hasValue = false, | 144 _hasValue = false, |
| 147 name = null; | 145 name = null; |
| 148 | 146 |
| 149 /** | 147 /** |
| 150 * Creates error containing the invalid [value]. | 148 * Creates error containing the invalid [value]. |
| 151 * | 149 * |
| 152 * A message is built by suffixing the [message] argument with | 150 * A message is built by suffixing the [message] argument with |
| 153 * the [name] argument (if provided) and the value. Example | 151 * the [name] argument (if provided) and the value. Example |
| 154 * | 152 * |
| 155 * "Invalid argument (foo): null" | 153 * "Invalid argument (foo): null" |
| 156 * | 154 * |
| 157 * The `name` should match the argument name of the function, but if | 155 * The `name` should match the argument name of the function, but if |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 final num start; | 196 final num start; |
| 199 /** The maximum value that [value] is allowed to assume. */ | 197 /** The maximum value that [value] is allowed to assume. */ |
| 200 final num end; | 198 final num end; |
| 201 | 199 |
| 202 // TODO(lrn): This constructor should be called only with string values. | 200 // TODO(lrn): This constructor should be called only with string values. |
| 203 // It currently isn't in all cases. | 201 // It currently isn't in all cases. |
| 204 /** | 202 /** |
| 205 * Create a new [RangeError] with the given [message]. | 203 * Create a new [RangeError] with the given [message]. |
| 206 */ | 204 */ |
| 207 RangeError(var message) | 205 RangeError(var message) |
| 208 : start = null, end = null, super(message); | 206 : start = null, |
| 207 end = null, |
| 208 super(message); |
| 209 | 209 |
| 210 /** | 210 /** |
| 211 * Create a new [RangeError] with a message for the given [value]. | 211 * Create a new [RangeError] with a message for the given [value]. |
| 212 * | 212 * |
| 213 * An optional [name] can specify the argument name that has the | 213 * An optional [name] can specify the argument name that has the |
| 214 * invalid value, and the [message] can override the default error | 214 * invalid value, and the [message] can override the default error |
| 215 * description. | 215 * description. |
| 216 */ | 216 */ |
| 217 RangeError.value(num value, [String name, String message]) | 217 RangeError.value(num value, [String name, String message]) |
| 218 : start = null, end = null, | 218 : start = null, |
| 219 super.value(value, name, | 219 end = null, |
| 220 (message != null) ? message : "Value not in range"); | 220 super.value( |
| 221 value, name, (message != null) ? message : "Value not in range"); |
| 221 | 222 |
| 222 /** | 223 /** |
| 223 * Create a new [RangeError] for a value being outside the valid range. | 224 * Create a new [RangeError] for a value being outside the valid range. |
| 224 * | 225 * |
| 225 * The allowed range is from [minValue] to [maxValue], inclusive. | 226 * The allowed range is from [minValue] to [maxValue], inclusive. |
| 226 * If `minValue` or `maxValue` are `null`, the range is infinite in | 227 * If `minValue` or `maxValue` are `null`, the range is infinite in |
| 227 * that direction. | 228 * that direction. |
| 228 * | 229 * |
| 229 * For a range from 0 to the length of something, end exclusive, use | 230 * For a range from 0 to the length of something, end exclusive, use |
| 230 * [RangeError.index]. | 231 * [RangeError.index]. |
| 231 * | 232 * |
| 232 * An optional [name] can specify the argument name that has the | 233 * An optional [name] can specify the argument name that has the |
| 233 * invalid value, and the [message] can override the default error | 234 * invalid value, and the [message] can override the default error |
| 234 * description. | 235 * description. |
| 235 */ | 236 */ |
| 236 RangeError.range(num invalidValue, int minValue, int maxValue, | 237 RangeError.range(num invalidValue, int minValue, int maxValue, |
| 237 [String name, String message]) | 238 [String name, String message]) |
| 238 : start = minValue, | 239 : start = minValue, |
| 239 end = maxValue, | 240 end = maxValue, |
| 240 super.value(invalidValue, name, | 241 super.value( |
| 241 (message != null) ? message : "Invalid value"); | 242 invalidValue, name, (message != null) ? message : "Invalid value"); |
| 242 | 243 |
| 243 /** | 244 /** |
| 244 * Creates a new [RangeError] stating that [index] is not a valid index | 245 * Creates a new [RangeError] stating that [index] is not a valid index |
| 245 * into [indexable]. | 246 * into [indexable]. |
| 246 * | 247 * |
| 247 * An optional [name] can specify the argument name that has the | 248 * An optional [name] can specify the argument name that has the |
| 248 * invalid value, and the [message] can override the default error | 249 * invalid value, and the [message] can override the default error |
| 249 * description. | 250 * description. |
| 250 * | 251 * |
| 251 * The [length] is the length of [indexable] at the time of the error. | 252 * The [length] is the length of [indexable] at the time of the error. |
| 252 * If `length` is omitted, it defaults to `indexable.length`. | 253 * If `length` is omitted, it defaults to `indexable.length`. |
| 253 */ | 254 */ |
| 254 factory RangeError.index(int index, indexable, | 255 factory RangeError.index(int index, indexable, |
| 255 [String name, | 256 [String name, String message, int length]) = IndexError; |
| 256 String message, | |
| 257 int length]) = IndexError; | |
| 258 | 257 |
| 259 /** | 258 /** |
| 260 * Check that a [value] lies in a specific interval. | 259 * Check that a [value] lies in a specific interval. |
| 261 * | 260 * |
| 262 * Throws if [value] is not in the interval. | 261 * Throws if [value] is not in the interval. |
| 263 * The interval is from [minValue] to [maxValue], both inclusive. | 262 * The interval is from [minValue] to [maxValue], both inclusive. |
| 264 */ | 263 */ |
| 265 static void checkValueInInterval(int value, int minValue, int maxValue, | 264 static void checkValueInInterval(int value, int minValue, int maxValue, |
| 266 [String name, String message]) { | 265 [String name, String message]) { |
| 267 if (value < minValue || value > maxValue) { | 266 if (value < minValue || value > maxValue) { |
| 268 throw new RangeError.range(value, minValue, maxValue, name, message); | 267 throw new RangeError.range(value, minValue, maxValue, name, message); |
| 269 } | 268 } |
| 270 } | 269 } |
| 271 | 270 |
| 272 /** | 271 /** |
| 273 * Check that a value is a valid index into an indexable object. | 272 * Check that a value is a valid index into an indexable object. |
| 274 * | 273 * |
| 275 * Throws if [index] is not a valid index into [indexable]. | 274 * Throws if [index] is not a valid index into [indexable]. |
| 276 * | 275 * |
| 277 * An indexable object is one that has a `length` and a and index-operator | 276 * An indexable object is one that has a `length` and a and index-operator |
| 278 * `[]` that accepts an index if `0 <= index < length`. | 277 * `[]` that accepts an index if `0 <= index < length`. |
| 279 * | 278 * |
| 280 * If [length] is provided, it is used as the length of the indexable object, | 279 * If [length] is provided, it is used as the length of the indexable object, |
| 281 * otherwise the length is found as `indexable.length`. | 280 * otherwise the length is found as `indexable.length`. |
| 282 */ | 281 */ |
| 283 static void checkValidIndex(int index, var indexable, | 282 static void checkValidIndex(int index, var indexable, |
| 284 [String name, int length, String message]) { | 283 [String name, int length, String message]) { |
| 285 if (length == null) length = indexable.length; | 284 if (length == null) length = indexable.length; |
| 286 // Comparing with `0` as receiver produces better dart2js type inference. | 285 // Comparing with `0` as receiver produces better dart2js type inference. |
| 287 if (0 > index || index >= length) { | 286 if (0 > index || index >= length) { |
| 288 if (name == null) name = "index"; | 287 if (name == null) name = "index"; |
| 289 throw new RangeError.index(index, indexable, name, message, length); | 288 throw new RangeError.index(index, indexable, name, message, length); |
| 290 } | 289 } |
| 291 } | 290 } |
| 292 | 291 |
| 293 /** | 292 /** |
| 294 * Check that a range represents a slice of an indexable object. | 293 * Check that a range represents a slice of an indexable object. |
| 295 * | 294 * |
| 296 * Throws if the range is not valid for an indexable object with | 295 * Throws if the range is not valid for an indexable object with |
| 297 * the given [length]. | 296 * the given [length]. |
| 298 * A range is valid for an indexable object with a given [length] | 297 * A range is valid for an indexable object with a given [length] |
| 299 * | 298 * |
| 300 * if `0 <= [start] <= [end] <= [length]`. | 299 * if `0 <= [start] <= [end] <= [length]`. |
| 301 * An `end` of `null` is considered equivalent to `length`. | 300 * An `end` of `null` is considered equivalent to `length`. |
| 302 * | 301 * |
| 303 * The [startName] and [endName] defaults to `"start"` and `"end"`, | 302 * The [startName] and [endName] defaults to `"start"` and `"end"`, |
| 304 * respectively. | 303 * respectively. |
| 305 * | 304 * |
| 306 * Returns the actual `end` value, which is `length` if `end` is `null`, | 305 * Returns the actual `end` value, which is `length` if `end` is `null`, |
| 307 * and `end` otherwise. | 306 * and `end` otherwise. |
| 308 */ | 307 */ |
| 309 static int checkValidRange(int start, int end, int length, | 308 static int checkValidRange(int start, int end, int length, |
| 310 [String startName, String endName, | 309 [String startName, String endName, String message]) { |
| 311 String message]) { | |
| 312 // Comparing with `0` as receiver produces better dart2js type inference. | 310 // Comparing with `0` as receiver produces better dart2js type inference. |
| 313 // Ditto `start > end` below. | 311 // Ditto `start > end` below. |
| 314 if (0 > start || start > length) { | 312 if (0 > start || start > length) { |
| 315 if (startName == null) startName = "start"; | 313 if (startName == null) startName = "start"; |
| 316 throw new RangeError.range(start, 0, length, startName, message); | 314 throw new RangeError.range(start, 0, length, startName, message); |
| 317 } | 315 } |
| 318 if (end != null) { | 316 if (end != null) { |
| 319 if (start > end || end > length) { | 317 if (start > end || end > length) { |
| 320 if (endName == null) endName = "end"; | 318 if (endName == null) endName = "end"; |
| 321 throw new RangeError.range(end, start, length, endName, message); | 319 throw new RangeError.range(end, start, length, endName, message); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 /** | 371 /** |
| 374 * Creates a new [IndexError] stating that [invalidValue] is not a valid index | 372 * Creates a new [IndexError] stating that [invalidValue] is not a valid index |
| 375 * into [indexable]. | 373 * into [indexable]. |
| 376 * | 374 * |
| 377 * The [length] is the length of [indexable] at the time of the error. | 375 * The [length] is the length of [indexable] at the time of the error. |
| 378 * If `length` is omitted, it defaults to `indexable.length`. | 376 * If `length` is omitted, it defaults to `indexable.length`. |
| 379 * | 377 * |
| 380 * The message is used as part of the string representation of the error. | 378 * The message is used as part of the string representation of the error. |
| 381 */ | 379 */ |
| 382 IndexError(int invalidValue, indexable, | 380 IndexError(int invalidValue, indexable, |
| 383 [String name, String message, int length]) | 381 [String name, String message, int length]) |
| 384 : this.indexable = indexable, | 382 : this.indexable = indexable, |
| 385 this.length = (length != null) ? length : indexable.length, | 383 this.length = (length != null) ? length : indexable.length, |
| 386 super.value(invalidValue, name, | 384 super.value(invalidValue, name, |
| 387 (message != null) ? message : "Index out of range"); | 385 (message != null) ? message : "Index out of range"); |
| 388 | 386 |
| 389 // Getters inherited from RangeError. | 387 // Getters inherited from RangeError. |
| 390 int get start => 0; | 388 int get start => 0; |
| 391 int get end => length - 1; | 389 int get end => length - 1; |
| 392 | 390 |
| 393 String get _errorName => "RangeError"; | 391 String get _errorName => "RangeError"; |
| 394 String get _errorExplanation { | 392 String get _errorExplanation { |
| 395 assert(_hasValue); | 393 assert(_hasValue); |
| 396 if (invalidValue < 0) { | 394 if (invalidValue < 0) { |
| 397 return ": index must not be negative"; | 395 return ": index must not be negative"; |
| 398 } | 396 } |
| 399 if (length == 0) { | 397 if (length == 0) { |
| 400 return ": no indices are valid"; | 398 return ": no indices are valid"; |
| 401 } | 399 } |
| 402 return ": index should be less than $length"; | 400 return ": index should be less than $length"; |
| 403 } | 401 } |
| 404 } | 402 } |
| 405 | 403 |
| 406 | |
| 407 /** | 404 /** |
| 408 * Error thrown when control reaches the end of a switch case. | 405 * Error thrown when control reaches the end of a switch case. |
| 409 * | 406 * |
| 410 * The Dart specification requires this error to be thrown when | 407 * The Dart specification requires this error to be thrown when |
| 411 * control reaches the end of a switch case (except the last case | 408 * control reaches the end of a switch case (except the last case |
| 412 * of a switch) without meeting a break or similar end of the control | 409 * of a switch) without meeting a break or similar end of the control |
| 413 * flow. | 410 * flow. |
| 414 */ | 411 */ |
| 415 class FallThroughError extends Error { | 412 class FallThroughError extends Error { |
| 416 FallThroughError(); | 413 FallThroughError(); |
| 417 | 414 |
| 418 external String toString(); | 415 external String toString(); |
| 419 } | 416 } |
| 420 | 417 |
| 421 /** | 418 /** |
| 422 * Error thrown when trying to instantiate an abstract class. | 419 * Error thrown when trying to instantiate an abstract class. |
| 423 */ | 420 */ |
| 424 class AbstractClassInstantiationError extends Error { | 421 class AbstractClassInstantiationError extends Error { |
| 425 final String _className; | 422 final String _className; |
| 426 AbstractClassInstantiationError(String className) : _className = className; | 423 AbstractClassInstantiationError(String className) : _className = className; |
| 427 | 424 |
| 428 external String toString(); | 425 external String toString(); |
| 429 } | 426 } |
| 430 | 427 |
| 431 | |
| 432 /** | 428 /** |
| 433 * Error thrown by the default implementation of [:noSuchMethod:] on [Object]. | 429 * Error thrown by the default implementation of [:noSuchMethod:] on [Object]. |
| 434 */ | 430 */ |
| 435 class NoSuchMethodError extends Error { | 431 class NoSuchMethodError extends Error { |
| 436 final Object _receiver; | 432 final Object _receiver; |
| 437 final Symbol _memberName; | 433 final Symbol _memberName; |
| 438 final List _arguments; | 434 final List _arguments; |
| 439 final Map<Symbol, dynamic> _namedArguments; | 435 final Map<Symbol, dynamic> _namedArguments; |
| 440 final List _existingArgumentNames; | 436 final List _existingArgumentNames; |
| 441 | 437 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 455 * empty list. | 451 * empty list. |
| 456 * | 452 * |
| 457 * The [namedArguments] is a map from [Symbol]s to the values of named | 453 * The [namedArguments] is a map from [Symbol]s to the values of named |
| 458 * arguments that the method was called with. | 454 * arguments that the method was called with. |
| 459 * | 455 * |
| 460 * The optional [existingArgumentNames] is the expected parameters of a | 456 * The optional [existingArgumentNames] is the expected parameters of a |
| 461 * method with the same name on the receiver, if available. This is | 457 * method with the same name on the receiver, if available. This is |
| 462 * the signature of the method that would have been called if the parameters | 458 * the signature of the method that would have been called if the parameters |
| 463 * had matched. | 459 * had matched. |
| 464 */ | 460 */ |
| 465 external NoSuchMethodError(Object receiver, | 461 external NoSuchMethodError(Object receiver, Symbol memberName, |
| 466 Symbol memberName, | 462 List positionalArguments, Map<Symbol, dynamic> namedArguments, |
| 467 List positionalArguments, | 463 [List existingArgumentNames = null]); |
| 468 Map<Symbol, dynamic> namedArguments, | |
| 469 [List existingArgumentNames = null]); | |
| 470 | 464 |
| 471 external String toString(); | 465 external String toString(); |
| 472 } | 466 } |
| 473 | 467 |
| 474 | |
| 475 /** | 468 /** |
| 476 * The operation was not allowed by the object. | 469 * The operation was not allowed by the object. |
| 477 * | 470 * |
| 478 * This [Error] is thrown when an instance cannot implement one of the methods | 471 * This [Error] is thrown when an instance cannot implement one of the methods |
| 479 * in its signature. | 472 * in its signature. |
| 480 */ | 473 */ |
| 481 class UnsupportedError extends Error { | 474 class UnsupportedError extends Error { |
| 482 final String message; | 475 final String message; |
| 483 UnsupportedError(this.message); | 476 UnsupportedError(this.message); |
| 484 String toString() => "Unsupported operation: $message"; | 477 String toString() => "Unsupported operation: $message"; |
| 485 } | 478 } |
| 486 | 479 |
| 487 | |
| 488 /** | 480 /** |
| 489 * Thrown by operations that have not been implemented yet. | 481 * Thrown by operations that have not been implemented yet. |
| 490 * | 482 * |
| 491 * This [Error] is thrown by unfinished code that hasn't yet implemented | 483 * This [Error] is thrown by unfinished code that hasn't yet implemented |
| 492 * all the features it needs. | 484 * all the features it needs. |
| 493 * | 485 * |
| 494 * If a class is not intending to implement the feature, it should throw | 486 * If a class is not intending to implement the feature, it should throw |
| 495 * an [UnsupportedError] instead. This error is only intended for | 487 * an [UnsupportedError] instead. This error is only intended for |
| 496 * use during development. | 488 * use during development. |
| 497 */ | 489 */ |
| 498 class UnimplementedError extends Error implements UnsupportedError { | 490 class UnimplementedError extends Error implements UnsupportedError { |
| 499 final String message; | 491 final String message; |
| 500 UnimplementedError([this.message]); | 492 UnimplementedError([this.message]); |
| 501 String toString() => (this.message != null | 493 String toString() => (this.message != null |
| 502 ? "UnimplementedError: $message" | 494 ? "UnimplementedError: $message" |
| 503 : "UnimplementedError"); | 495 : "UnimplementedError"); |
| 504 } | 496 } |
| 505 | 497 |
| 506 | |
| 507 /** | 498 /** |
| 508 * The operation was not allowed by the current state of the object. | 499 * The operation was not allowed by the current state of the object. |
| 509 * | 500 * |
| 510 * This is a generic error used for a variety of different erroneous | 501 * This is a generic error used for a variety of different erroneous |
| 511 * actions. The message should be descriptive. | 502 * actions. The message should be descriptive. |
| 512 */ | 503 */ |
| 513 class StateError extends Error { | 504 class StateError extends Error { |
| 514 final String message; | 505 final String message; |
| 515 StateError(this.message); | 506 StateError(this.message); |
| 516 String toString() => "Bad state: $message"; | 507 String toString() => "Bad state: $message"; |
| 517 } | 508 } |
| 518 | 509 |
| 519 | |
| 520 /** | 510 /** |
| 521 * Error occurring when a collection is modified during iteration. | 511 * Error occurring when a collection is modified during iteration. |
| 522 * | 512 * |
| 523 * Some modifications may be allowed for some collections, so each collection | 513 * Some modifications may be allowed for some collections, so each collection |
| 524 * ([Iterable] or similar collection of values) should declare which operations | 514 * ([Iterable] or similar collection of values) should declare which operations |
| 525 * are allowed during an iteration. | 515 * are allowed during an iteration. |
| 526 */ | 516 */ |
| 527 class ConcurrentModificationError extends Error { | 517 class ConcurrentModificationError extends Error { |
| 528 /** The object that was modified in an incompatible way. */ | 518 /** The object that was modified in an incompatible way. */ |
| 529 final Object modifiedObject; | 519 final Object modifiedObject; |
| 530 | 520 |
| 531 ConcurrentModificationError([this.modifiedObject]); | 521 ConcurrentModificationError([this.modifiedObject]); |
| 532 | 522 |
| 533 String toString() { | 523 String toString() { |
| 534 if (modifiedObject == null) { | 524 if (modifiedObject == null) { |
| 535 return "Concurrent modification during iteration."; | 525 return "Concurrent modification during iteration."; |
| 536 } | 526 } |
| 537 return "Concurrent modification during iteration: " | 527 return "Concurrent modification during iteration: " |
| 538 "${Error.safeToString(modifiedObject)}."; | 528 "${Error.safeToString(modifiedObject)}."; |
| 539 } | 529 } |
| 540 } | 530 } |
| 541 | 531 |
| 542 | |
| 543 class OutOfMemoryError implements Error { | 532 class OutOfMemoryError implements Error { |
| 544 const OutOfMemoryError(); | 533 const OutOfMemoryError(); |
| 545 String toString() => "Out of Memory"; | 534 String toString() => "Out of Memory"; |
| 546 | 535 |
| 547 StackTrace get stackTrace => null; | 536 StackTrace get stackTrace => null; |
| 548 } | 537 } |
| 549 | 538 |
| 550 | |
| 551 class StackOverflowError implements Error { | 539 class StackOverflowError implements Error { |
| 552 const StackOverflowError(); | 540 const StackOverflowError(); |
| 553 String toString() => "Stack Overflow"; | 541 String toString() => "Stack Overflow"; |
| 554 | 542 |
| 555 StackTrace get stackTrace => null; | 543 StackTrace get stackTrace => null; |
| 556 } | 544 } |
| 557 | 545 |
| 558 /** | 546 /** |
| 559 * Error thrown when a lazily initialized variable cannot be initialized. | 547 * Error thrown when a lazily initialized variable cannot be initialized. |
| 560 * | 548 * |
| 561 * A static/library variable with an initializer expression is initialized | 549 * A static/library variable with an initializer expression is initialized |
| 562 * the first time it is read. If evaluating the initializer expression causes | 550 * the first time it is read. If evaluating the initializer expression causes |
| 563 * another read of the variable, this error is thrown. | 551 * another read of the variable, this error is thrown. |
| 564 */ | 552 */ |
| 565 class CyclicInitializationError extends Error { | 553 class CyclicInitializationError extends Error { |
| 566 final String variableName; | 554 final String variableName; |
| 567 CyclicInitializationError([this.variableName]); | 555 CyclicInitializationError([this.variableName]); |
| 568 String toString() => variableName == null | 556 String toString() => variableName == null |
| 569 ? "Reading static variable during its initialization" | 557 ? "Reading static variable during its initialization" |
| 570 : "Reading static variable '$variableName' during its initialization"; | 558 : "Reading static variable '$variableName' during its initialization"; |
| 571 } | 559 } |
| OLD | NEW |