add ets error

Signed-off-by: zhangzezhong <zhangzezhong8@huawei-partners.com>
This commit is contained in:
zhangzezhong
2025-06-09 21:21:54 +08:00
parent ffd8158d5d
commit 7358b33ce5
3 changed files with 281 additions and 0 deletions
@@ -0,0 +1,237 @@
/*
* Copyright (c) 2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ets_error_utils.h"
#include "hilog_tag_wrapper.h"
namespace OHOS {
namespace AbilityRuntime {
namespace {
constexpr const char* ERR_MSG_TOO_FEW_PARAM = "Parameter error. Too few parameters.";
constexpr const char* ERR_MSG_NOT_MAINTHREAD = "Caller error. Caller from non-main thread.";
constexpr const char* ERR_MSG_INVALID_NUM_PARAMS = "Parameter error. The number of parameters is invalid.";
constexpr const char* NOT_SYSTEM_APP = "The application is not system-app, can not use system-api.";
constexpr const char* BUSINESS_ERROR_CLASS = "L@ohos/base/BusinessError;";
} // namespace
void ThrowEtsError(ani_env *env, ani_object err)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
env->ThrowError(static_cast<ani_error>(err));
}
void ThrowEtsError(ani_env *env, int32_t errCode, const std::string &errorMsg)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsError(env, errCode, errorMsg));
}
void ThrowEtsError(ani_env *env, const AbilityErrorCode &err)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsError(env, static_cast<int32_t>(err), GetErrorMsg(err)));
}
void ThrowEtsInvalidCallerError(ani_env *env)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsError(env,
static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_CALLER),
ERR_MSG_NOT_MAINTHREAD));
}
void ThrowEtsTooFewParametersError(ani_env *env)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsError(env,
static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_PARAM),
ERR_MSG_TOO_FEW_PARAM));
}
void ThrowEtsInvalidNumParametersError(ani_env *env)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsError(env,
static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_PARAM),
ERR_MSG_INVALID_NUM_PARAMS));
}
void ThrowEtsNoPermissionError(ani_env *env, const std::string &permission)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsError(env,
static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_PERMISSION_DENIED),
GetNoPermissionErrorMsg(permission)));
}
void ThrowEtsNotSystemAppError(ani_env *env)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsError(env,
static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP),
NOT_SYSTEM_APP));
}
void ThrowEtsInvalidParamError(ani_env *env, const std::string &message)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsInvalidParamError(env, message));
}
void ThrowEtsErrorByNativeErr(ani_env *env, int32_t err)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return;
}
ThrowEtsError(env, CreateEtsErrorByNativeErr(env, err));
}
ani_object CreateEtsError(ani_env *env, const AbilityErrorCode &err)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return nullptr;
}
return CreateEtsError(env, static_cast<int32_t>(err), GetErrorMsg(err));
}
ani_object CreateEtsInvalidParamError(ani_env *env, const std::string &message)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return nullptr;
}
return CreateEtsError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INVALID_PARAM), message);
}
ani_object CreateEtsNoPermissionError(ani_env *env, const std::string &permission)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return nullptr;
}
return CreateEtsError(env,
static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_PERMISSION_DENIED),
GetNoPermissionErrorMsg(permission));
}
ani_object CreateEtsErrorByNativeErr(ani_env *env, int32_t err, const std::string &permission)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return nullptr;
}
auto errCode = GetJsErrorCodeByNativeError(err);
auto errMsg = (errCode == AbilityErrorCode::ERROR_CODE_PERMISSION_DENIED && !permission.empty()) ?
GetNoPermissionErrorMsg(permission) : GetErrorMsg(errCode);
return CreateEtsError(env, static_cast<int32_t>(errCode), errMsg);
}
ani_object WrapEtsError(ani_env *env, const std::string &msg)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return nullptr;
}
ani_status status = ANI_ERROR;
ani_string aniMsg = nullptr;
if ((status = env->String_NewUTF8(msg.c_str(), msg.size(), &aniMsg)) != ANI_OK) {
TAG_LOGE(AAFwkTag::ANI, "String_NewUTF8 failed %{public}d", status);
return nullptr;
}
ani_ref undefRef;
if ((status = env->GetUndefined(&undefRef)) != ANI_OK) {
TAG_LOGE(AAFwkTag::ANI, "GetUndefined failed %{public}d", status);
return nullptr;
}
ani_class cls = nullptr;
if ((status = env->FindClass("Lescompat/Error;", &cls)) != ANI_OK) {
TAG_LOGE(AAFwkTag::ANI, "FindClass failed %{public}d", status);
return nullptr;
}
ani_method method = nullptr;
if ((status = env->Class_FindMethod(cls, "<ctor>", "Lstd/core/String;Lescompat/ErrorOptions;:V", &method)) !=
ANI_OK) {
TAG_LOGE(AAFwkTag::ANI, "Class_FindMethod failed %{public}d", status);
return nullptr;
}
ani_object obj = nullptr;
if ((status = env->Object_New(cls, method, &obj, aniMsg, undefRef)) != ANI_OK) {
TAG_LOGE(AAFwkTag::ANI, "Object_New failed %{public}d", status);
return nullptr;
}
return obj;
}
ani_object CreateEtsError(ani_env *env, ani_int code, const std::string &msg)
{
if (env == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "null env");
return nullptr;
}
ani_status status = ANI_ERROR;
ani_class cls = nullptr;
if ((status = env->FindClass(BUSINESS_ERROR_CLASS, &cls)) != ANI_OK) {
TAG_LOGE(AAFwkTag::ANI, "FindClass failed %{public}d", status);
return nullptr;
}
ani_method method = nullptr;
if ((status = env->Class_FindMethod(cls, "<ctor>", "DLescompat/Error;:V", &method)) != ANI_OK) {
TAG_LOGE(AAFwkTag::ANI, "Class_FindMethod failed %{public}d", status);
return nullptr;
}
ani_object error = WrapEtsError(env, msg);
if (error == nullptr) {
TAG_LOGE(AAFwkTag::ANI, "error nulll");
return nullptr;
}
ani_object obj = nullptr;
ani_double dCode(code);
if ((status = env->Object_New(cls, method, &obj, dCode, error)) != ANI_OK) {
TAG_LOGE(AAFwkTag::ANI, "Object_New failed %{public}d", status);
return nullptr;
}
return obj;
}
} // namespace AbilityRuntime
} // namespace OHOS
+1
View File
@@ -60,6 +60,7 @@ ohos_shared_library("runtime") {
sources = [
"${ability_runtime_native_path}/appkit/ability_bundle_manager_helper/bundle_mgr_helper.cpp",
"${ability_runtime_native_path}/runtime/ets_error_utils.cpp",
"${ability_runtime_native_path}/runtime/hdc_register.cpp",
"${ability_runtime_native_path}/runtime/js_app_process_state.cpp",
"${ability_runtime_native_path}/runtime/js_data_struct_converter.cpp",
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OHOS_ABILITY_RUNTIME_ETS_ERROR_UTILS_H
#define OHOS_ABILITY_RUNTIME_ETS_ERROR_UTILS_H
#include "ability_business_error.h"
#include "ani.h"
namespace OHOS {
namespace AbilityRuntime {
void ThrowEtsError(ani_env *env, ani_object err);
void ThrowEtsError(ani_env *env, int32_t errCode, const std::string &errorMsg = "");
void ThrowEtsError(ani_env *env, const AbilityErrorCode &err);
void ThrowEtsInvalidCallerError(ani_env *env);
void ThrowEtsTooFewParametersError(ani_env *env);
void ThrowEtsInvalidNumParametersError(ani_env *env);
void ThrowEtsNoPermissionError(ani_env *env, const std::string &permission);
void ThrowEtsInvalidParamError(ani_env *env, const std::string &message);
void ThrowEtsErrorByNativeErr(ani_env *env, int32_t err);
void ThrowEtsNotSystemAppError(ani_env *env);
ani_object CreateEtsError(ani_env *env, const AbilityErrorCode &err);
ani_object CreateEtsError(ani_env *env, ani_int code, const std::string &msg);
ani_object CreateEtsInvalidParamError(ani_env *env, const std::string &message);
ani_object CreateEtsNoPermissionError(ani_env *env, const std::string &permission);
ani_object CreateEtsErrorByNativeErr(ani_env *env, int32_t err, const std::string &permission = "");
ani_object WrapEtsError(ani_env *env, const std::string &msg);
} // namespace AbilityRuntime
} // namespace OHOS
#endif // OHOS_ABILITY_RUNTIME_ETS_ERROR_UTILS_H