{% if has_error %}
{% if is_async %}
    let Some(result) = run_or_throw(env, std::panic::AssertUnwindSafe(|| {{ async_call_expr }})) else {
        return {{ ret_null }};
    };
{% else %}
    let result = {{ call_expr }};
{% endif %}
    match result {
        Err(e) => {
            throw_jni_error(env, &format!("{e}"));
            {{ ret_null }}
        }
        Ok(v) => {
{{ ok_body }}        }
    }
{% else %}
{% if is_async %}
    let Some(v) = run_or_throw(env, std::panic::AssertUnwindSafe(|| {{ async_call_expr }})) else {
        return {{ ret_null }};
    };
{% else %}
    let v = {{ call_expr }};
{% endif %}
{{ value_body }}{% endif %}
}
