1 /*
2 * Copyright (c) 2022-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "business_error.h"
17
18 #include <unordered_map>
19
20 #include "bundle_errors.h"
21 #include "business_error_map.h"
22
23 namespace OHOS {
24 namespace AppExecFwk {
25
ThrowError(napi_env env,int32_t err,const std::string & msg)26 void BusinessError::ThrowError(napi_env env, int32_t err, const std::string &msg)
27 {
28 napi_value error = CreateError(env, err, msg);
29 napi_throw(env, error);
30 }
31
ThrowParameterTypeError(napi_env env,int32_t err,const std::string & parameter,const std::string & type)32 void BusinessError::ThrowParameterTypeError(napi_env env, int32_t err,
33 const std::string ¶meter, const std::string &type)
34 {
35 napi_value error = CreateCommonError(env, err, parameter, type);
36 napi_throw(env, error);
37 }
38
ThrowTooFewParametersError(napi_env env,int32_t err)39 void BusinessError::ThrowTooFewParametersError(napi_env env, int32_t err)
40 {
41 ThrowError(env, err, BusinessErrorNS::ERR_MSG_PARAM_NUMBER_ERROR);
42 }
43
CreateError(napi_env env,int32_t err,const std::string & msg)44 napi_value BusinessError::CreateError(napi_env env, int32_t err, const std::string& msg)
45 {
46 napi_value businessError = nullptr;
47 napi_value errorCode = nullptr;
48 NAPI_CALL(env, napi_create_int32(env, err, &errorCode));
49 napi_value errorMessage = nullptr;
50 NAPI_CALL(env, napi_create_string_utf8(env, msg.c_str(), NAPI_AUTO_LENGTH, &errorMessage));
51 napi_create_error(env, nullptr, errorMessage, &businessError);
52 napi_set_named_property(env, businessError, "code", errorCode);
53 return businessError;
54 }
55
CreateCommonError(napi_env env,int32_t err,const std::string & functionName,const std::string & permissionName)56 napi_value BusinessError::CreateCommonError(
57 napi_env env, int32_t err, const std::string &functionName, const std::string &permissionName)
58 {
59 std::string errMessage = BusinessErrorNS::ERR_MSG_BUSINESS_ERROR;
60 auto iter = errMessage.find("$");
61 if (iter != std::string::npos) {
62 errMessage = errMessage.replace(iter, 1, std::to_string(err));
63 }
64 std::unordered_map<int32_t, const char*> errMap;
65 BusinessErrorMap::GetErrMap(errMap);
66 if (errMap.find(err) != errMap.end()) {
67 errMessage += errMap[err];
68 }
69 iter = errMessage.find("$");
70 if (iter != std::string::npos) {
71 errMessage = errMessage.replace(iter, 1, functionName);
72 iter = errMessage.find("$");
73 if (iter != std::string::npos) {
74 errMessage = errMessage.replace(iter, 1, permissionName);
75 }
76 }
77 return CreateError(env, err, errMessage);
78 }
79
CreateInstallError(napi_env env,int32_t err,int32_t innerCode,const std::string & functionName,const std::string & permissionName)80 napi_value BusinessError::CreateInstallError(
81 napi_env env, int32_t err, int32_t innerCode,
82 const std::string &functionName, const std::string &permissionName)
83 {
84 std::string errMessage = BusinessErrorNS::ERR_MSG_BUSINESS_ERROR;
85 auto iter = errMessage.find("$");
86 if (iter != std::string::npos) {
87 errMessage = errMessage.replace(iter, 1, std::to_string(err));
88 }
89 std::unordered_map<int32_t, const char*> errMap;
90 BusinessErrorMap::GetErrMap(errMap);
91 if (errMap.find(err) != errMap.end()) {
92 errMessage += errMap[err];
93 }
94 errMessage += "[" + std::to_string(innerCode) + "]";
95 iter = errMessage.find("$");
96 if (iter != std::string::npos) {
97 errMessage = errMessage.replace(iter, 1, functionName);
98 iter = errMessage.find("$");
99 if (iter != std::string::npos) {
100 errMessage = errMessage.replace(iter, 1, permissionName);
101 }
102 }
103 return CreateError(env, err, errMessage);
104 }
105
ThrowEnumError(napi_env env,const std::string & parameter,const std::string & type)106 void BusinessError::ThrowEnumError(napi_env env,
107 const std::string ¶meter, const std::string &type)
108 {
109 napi_value error = CreateEnumError(env, parameter, type);
110 napi_throw(env, error);
111 }
112
CreateEnumError(napi_env env,const std::string & parameter,const std::string & enumClass)113 napi_value BusinessError::CreateEnumError(napi_env env,
114 const std::string ¶meter, const std::string &enumClass)
115 {
116 std::string errMessage = BusinessErrorNS::ERR_MSG_BUSINESS_ERROR;
117 auto iter = errMessage.find("$");
118 if (iter != std::string::npos) {
119 errMessage = errMessage.replace(iter, 1, std::to_string(ERROR_PARAM_CHECK_ERROR));
120 }
121 errMessage += BusinessErrorNS::ERR_MSG_ENUM_ERROR;
122 iter = errMessage.find("$");
123 if (iter != std::string::npos) {
124 errMessage = errMessage.replace(iter, 1, parameter);
125 iter = errMessage.find("$");
126 if (iter != std::string::npos) {
127 errMessage = errMessage.replace(iter, 1, enumClass);
128 }
129 }
130 return CreateError(env, ERROR_PARAM_CHECK_ERROR, errMessage);
131 }
132 } // AppExecFwk
133 } // OHOS
134