全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
日志服务

错误处理

更新时间:2017-11-24 16:10:41

SDK 可能出现的异常错误可以分成如下几类:

  • 由日志服务端返回的错误。这类错误由日志服务端返回并由 SDK 处理。关于这类错误的详细细节可以参考日志服务 API 的 通用错误码 和各个 API 接口的具体说明。
  • 由 SDK 在向服务端发出请求时出现的网络错误。这类错误包括网络连接不通,服务端返回超时等。
  • 由 SDK 自身产生的、与平台及语言相关的错误,如内存溢出等。

目前,各个语言 SDK 的实现都采取抛出异常的方式处理错误。具体原则如下:

  • 由如上第一或者第二类错误将会被 SDK 处理并包装在统一的 LogException 类抛出给用户处理。
  • 由如上第三类错误不会被 SDK 处理,而是直接抛出平台及语言的 Native Exception 类给用户处理。

LogException:

LogException 类是 SDK 定义的、用于处理日志服务自身逻辑错误的异常类。它继承自各个语言的异常基类,提供如下异常信息:

  • 错误代码(Error Code):标示错误类型。如果是来自服务端的返回错误,则这个错误代码 API 返回的错误代码一致。如果是 SDK 网络请求错误,则其错误代码为 “RequestError”。具体请参考各个语言的完整 API 参考。
  • 错误消息(Error Message):标示错误消息。如果是来自服务端的响应错误,则这个错误消息 API 返回的错误消息一致。如果是 SDK 网络请求错误,则其错误消息为“request is failed.”。具体请参考各个语言的完整 API 参考。
  • 错误请求 ID(Request Id):标示当前错误对应于服务端的请求 ID。该 ID 只有在服务端返回错误消息时有效,否则为空字符串。用户可以在遇到错误请求时记下该请求 ID 并提供给日志服务团队进行问题追踪和定位。

请求失败与重试:

在使用 SDK 访问日志服务端时,有可能会因为网络临时中断、传输延时过程、服务端处理过慢等一系列原因导致请求失败。目前,这类错误都直接以异常抛出,日志服务内部并未对此做任何重试逻辑。所以,您在使用 SDK 时需要自己定义相应的处理逻辑(重试请求或者直接报错等)。

示例:

假设您需要访问“华东 1 (杭州)”Region 下名字为 big-game 的 Project,且在出现网络异常时主动重试指定次数。各语言的代码片段如下:

Java:
  1. //其他代码......
  2. String accessId = "your_access_id"; //TODO:用您的真实阿里云 AccessKeyId 替代。
  3. String accessKey = "your_access_key"; //TODO:用您的真实阿里云 AccessKeySecret 替代。
  4. String project = "big-game";
  5. String endpoint = "cn-hangzhou.sls.aliyuncs.com";
  6. int max_retries = 3;
  7. /*
  8. * 构建一个 client
  9. */
  10. Client client = new Client(accessId, accessKey, endpoint);
  11. ListLogStoresRequest lsRequest = new ListLogStoresRequest(project);
  12. for (int i = 0; i < max_retries; i++)
  13. {
  14. try
  15. {
  16. ListLogStoresResponse res = client.ListLogStores(lsRequest)
  17. //TODO: 处理返回的 response......
  18. break;
  19. }
  20. catch(LogException ex)
  21. {
  22. if (e.GetErrorCode() == "RequestError")
  23. {
  24. if ( i == max_retries - 1)
  25. {
  26. System.out.println("request is still failed after all retries.");
  27. break;
  28. }
  29. else
  30. System.out.println("request error happens, retry it!");
  31. }
  32. else
  33. {
  34. System.out.println("error code :" + e.GetErrorCode());
  35. System.out.println("error message :" + e.GetErrorMessage());
  36. System.out.println("error requestId :" + e.GetRequestId());
  37. break;
  38. }
  39. }
  40. catch(...)
  41. {
  42. System.out.println("unrecoverable exception when listing logstores.");
  43. break;
  44. }
  45. }
  46. //其他代码......
.NET(C#):
  1. //其他代码......
  2. String accessId = "your_access_id"; //TODO:用您的真实阿里云 AccessKeyId 替代。
  3. String accessKey = "your_access_key"; //TODO:用您的真实阿里云 AccessKeySecret 替代。
  4. String project = "big-game";
  5. String endpoint = "cn-hangzhou.sls.aliyuncs.com";
  6. int max_retries = 3;
  7. //创建一个 Client
  8. SLSClient client = new SLSClient(endpoint, accessId, accessKey);
  9. ListLogstoresRequest request = new ListLogstoresRequest();
  10. request.Project = project;
  11. for (int i = 0; i < max_retries; i++)
  12. {
  13. try
  14. {
  15. ListLogstoresResponse response = client.ListLogstores(request);
  16. //TODO: 处理返回的 response......
  17. break;
  18. }
  19. catch(LogException ex)
  20. {
  21. if (e.errorCode == "SLSRequestError")
  22. {
  23. if ( i == max_retries - 1)
  24. {
  25. Console.Writeline(“request is still failed after all retries.”);
  26. break;
  27. }
  28. else
  29. {
  30. Console.Writeline("request error happens, retry it!");
  31. }
  32. }
  33. else
  34. {
  35. Console.Writeline("error code :" + e.errorCode;
  36. Console.Writeline("error message :" + e.Message;
  37. Console.Writeline("error requestId :" + e.RequestId;
  38. break;
  39. }
  40. }
  41. catch(...)
  42. {
  43. Console.Writeline("unrecoverable exception when listing logstores.");
  44. break;
  45. }
  46. }
  47. //其他代码......
PHP:
  1. <?php
  2. //其他代码......
  3. $endpoint = 'cn-hangzhou.sls.aliyuncs.com';
  4. $accessId = 'your_access_id'; // TODO:用你的真实阿里云 AccessKeyId 替代
  5. $accessKey = 'your_access_key'; //TODO:用你的真实阿里云 AccessKeySecret 替代
  6. $maxRetries = 3;
  7. // 构建一个 sls client
  8. $client = new Aliyun_Sls_Client($endpoint, $accessId, $accessKey);
  9. $project = 'big-game';
  10. $request = new Aliyun_Sls_Models_ListLogstoresRequest($project);
  11. for($i = 0; $i < $maxRetries; ++$i)
  12. {
  13. try
  14. {
  15. $response = $client->ListLogstores($request);
  16. //TODO: 处理返回的 response......
  17. break;
  18. }
  19. catch (Aliyun_Sls_Exception $e)
  20. {
  21. if ($e->getErrorCode()=='RequestError')
  22. {
  23. if ($i+1 == $maxRetries)
  24. {
  25. echo "error code :" . $e->getErrorCode() . PHP_EOL;
  26. echo "error message :" . $e->getErrorMessage() . PHP_EOL;
  27. break;
  28. }
  29. echo 'request error happens, retry it!' . PHP_EOL;
  30. }
  31. else
  32. {
  33. echo "error code :" . $e->getErrorCode() . PHP_EOL;
  34. echo "error message :" . $e->getErrorMessage() . PHP_EOL;
  35. echo "error requestId :" . $e->getRequestId() . PHP_EOL;
  36. break;
  37. }
  38. }
  39. catch (Exception $ex)
  40. {
  41. echo 'unrecoverable exception when listing logstores.' . PHP_EOL;
  42. var_dump($ex);
  43. break;
  44. }
  45. }
  46. //其他代码......
Python:
  1. //其他代码......
  2. endpoint = 'cn-hangzhou.sls.aliyuncs.com'
  3. accessId = 'your_access_id' # TODO:用你的真实阿里云 AccessKeyId 替代
  4. accessKey = 'your_access_key' # TODO:用你的真实阿里云 AccessKeySecret 替代
  5. maxRetries = 3
  6. # 构建一个 client
  7. client = Client(endpoint, accessId, accessKey)
  8. project = 'big-game'
  9. lsRequest = ListLogstoresRequest(project)
  10. for i in xrange(maxRetries):
  11. try:
  12. res = client.ListLogstores(lsRequest)
  13. # TODO: 处理返回的 response......
  14. break
  15. except LogException as e:
  16. if e.getErrorCode() == "RequestError":
  17. if i+1 == maxRetries:
  18. print "error code :" + e.getErrorCode()
  19. print "error message :" + e.getErrorMessage()
  20. break
  21. else:
  22. print "request error happens, retry it!"
  23. else:
  24. print "error code :" + e.getErrorCode()
  25. print "error message :" + e.getErrorMessage()
  26. print "error requestId :" + e.getRequestId()
  27. break
  28. except Exception as e:
  29. print 'unrecoverable exception when listing logstores.'
  30. break
  31. //其他代码......
本文导读目录