73

我编写了这段代码来测试自定义异常在 dart 中的工作方式。

我没有得到想要的输出有人可以向我解释如何处理它吗?

void main() 
{   
  try
  {
    throwException();
  }
  on customException
  {
    print("custom exception is been obtained");
  }
  
}

throwException()
{
  throw new customException('This is my first custom exception');
}
4

5 回答 5

126

您可以查看A Tour of the Dart Language的Exception 部分

以下代码按预期工作(custom exception has been obtained显示在控制台中):

class CustomException implements Exception {
  String cause;
  CustomException(this.cause);
}

void main() {
  try {
    throwException();
  } on CustomException {
    print("custom exception has been obtained");
  }
}

throwException() {
  throw new CustomException('This is my first custom exception');
}
于 2012-11-27T08:38:22.703 回答
44

如果您不关心异常的类型,则不需要异常类。只需触发这样的异常:

throw ("This is my first general exception");
于 2020-01-09T10:46:49.923 回答
17

Dart 代码可以抛出和捕获异常。与 Java 相比,Dart 的所有异常都是未经检查的异常。方法不声明它们可能抛出哪些异常,并且您不需要捕获任何异常。

Dart 提供ExceptionError类型,但你可以抛出任何非空对象:

throw Exception('Something bad happened.');
throw 'Waaaaaaah!';

处理异常时使用tryoncatch关键字:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // A specific exception
  buyMoreLlamas();
} on Exception catch (e) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e) {
  // No specified type, handles all
  print('Something really unknown: $e');
}

try关键字的工作方式与大多数其他语言一样。使用on关键字按类型过滤特定异常,使用catch关键字获取对异常对象的引用。

如果不能完全处理异常,使用rethrow关键字传播异常:

try {
  breedMoreLlamas();
} catch (e) {
  print('I was just trying to breed llamas!.');
  rethrow;
}

要执行代码(无论是否引发异常),请使用finally

try {
  breedMoreLlamas();
} catch (e) {
  // ... handle exception ...
} finally {
  // Always clean up, even if an exception is thrown.
  cleanLlamaStalls();
}

代码示例

下面实现tryFunction()。它应该执行一个不可信的方法,然后执行以下操作:

  • 如果untrustworthy()抛出ExceptionWithMessage,则使用异常类型和消息调用logger.logException(尝试使用onand catch)。
  • 如果untrustworthy()抛出异常,logger.logException使用异常类型调用(尝试使用on这个)。
  • 如果untrustworthy()抛出任何其他对象,请不要捕获异常。
  • 在一切都被捕获和处理之后,调用logger.doneLogging(尝试使用finally)。

.

typedef VoidFunction = void Function();

class ExceptionWithMessage {
  final String message;
  const ExceptionWithMessage(this.message);
}

abstract class Logger {
  void logException(Type t, [String msg]);
  void doneLogging();
}

void tryFunction(VoidFunction untrustworthy, Logger logger) {
  try {
    untrustworthy();
  } on ExceptionWithMessage catch (e) {
    logger.logException(e.runtimeType, e.message);
  } on Exception {
    logger.logException(Exception);
  } finally {
    logger.doneLogging();
于 2021-01-23T02:58:40.363 回答
0

您还可以创建一个抽象异常。

灵感来自包(阅读Dart APIDart SDKTimeoutException上的代码)。async

abstract class IMoviesRepoException implements Exception {
  const IMoviesRepoException([this.message]);

  final String? message;

  @override
  String toString() {
    String result = 'IMoviesRepoExceptionl';
    if (message is String) return '$result: $message';
    return result;
  }
}

class TmdbMoviesRepoException extends IMoviesRepoException {
  const TmdbMoviesRepoException([String? message]) : super(message);
}
于 2021-10-12T21:19:13.580 回答
0
    Try this Simple Custom Exception Example for Beginners 
    
   class WithdrawException implements Exception{
  String wdExpMsg()=> 'Oops! something went wrong';
}
void main() {   
   try {   
      withdrawAmt(400);
   }   
  on WithdrawException{
    WithdrawException we=WithdrawException();
    print(we.wdExpMsg());
  }
  finally{
    print('Withdraw Amount<500 is not allowed');
  }
}    
void withdrawAmt(int amt) {   
   if (amt <= 499) {   
      throw WithdrawException();   
   }else{
     print('Collect Your Amount=$amt from ATM Machine...');
   }   
}    
于 2022-02-22T06:12:03.097 回答