mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-01-29 00:35:38 +08:00
fix: implement proper error handling for "Restart App" failures (#4951)
* fix: implement proper error handling for "Restart App" failures * fix: make clippy happy
This commit is contained in:
@@ -26,22 +26,35 @@ pub async fn restart_clash_core() {
|
|||||||
|
|
||||||
/// Restart the application
|
/// Restart the application
|
||||||
pub async fn restart_app() {
|
pub async fn restart_app() {
|
||||||
// logging_error!(Type::Core, true, CoreManager::global().stop_core().await);
|
// Step 1: Perform cleanup and check for errors
|
||||||
resolve::resolve_reset_async().await;
|
if let Err(err) = resolve::resolve_reset_async().await {
|
||||||
|
handle::Handle::notice_message(
|
||||||
|
"restart_app::error",
|
||||||
|
format!("Failed to cleanup resources: {err}"),
|
||||||
|
);
|
||||||
|
log::error!(target:"app", "Restart failed during cleanup: {err}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2: Attempt to get app handle and restart
|
||||||
match handle::Handle::global().app_handle() {
|
match handle::Handle::global().app_handle() {
|
||||||
Some(app_handle) => {
|
Some(app_handle) => {
|
||||||
|
handle::Handle::notice_message("restart_app::info", "Restarting application...");
|
||||||
app_handle.restart();
|
app_handle.restart();
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
|
handle::Handle::notice_message(
|
||||||
|
"restart_app::error",
|
||||||
|
"Failed to get app handle for restart",
|
||||||
|
);
|
||||||
logging_error!(
|
logging_error!(
|
||||||
Type::System,
|
Type::System,
|
||||||
false,
|
false,
|
||||||
"{}",
|
"{}",
|
||||||
"Failed to get app handle for restart, attempting alternative restart method"
|
"Failed to get app handle for restart"
|
||||||
);
|
);
|
||||||
// Fallback: launch a new instance of the application and exit the current one
|
|
||||||
|
|
||||||
|
// Fallback: launch a new instance of the application and exit the current one
|
||||||
let current_exe = env::current_exe().unwrap_or_else(|_| {
|
let current_exe = env::current_exe().unwrap_or_else(|_| {
|
||||||
exit(1); // Exit if can't find the executable path
|
exit(1); // Exit if can't find the executable path
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -103,16 +103,12 @@ pub fn resolve_setup_async() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 其它辅助函数不变
|
// 其它辅助函数不变
|
||||||
pub async fn resolve_reset_async() {
|
pub async fn resolve_reset_async() -> Result<(), anyhow::Error> {
|
||||||
logging!(info, Type::Tray, true, "Resetting system proxy");
|
logging!(info, Type::Tray, true, "Resetting system proxy");
|
||||||
logging_error!(
|
sysopt::Sysopt::global().reset_sysproxy().await?;
|
||||||
Type::System,
|
|
||||||
true,
|
|
||||||
sysopt::Sysopt::global().reset_sysproxy().await
|
|
||||||
);
|
|
||||||
|
|
||||||
logging!(info, Type::Core, true, "Stopping core service");
|
logging!(info, Type::Core, true, "Stopping core service");
|
||||||
logging_error!(Type::Core, true, CoreManager::global().stop_core().await);
|
CoreManager::global().stop_core().await?;
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
{
|
{
|
||||||
@@ -121,6 +117,8 @@ pub async fn resolve_reset_async() {
|
|||||||
logging!(info, Type::System, true, "Restoring system DNS settings");
|
logging!(info, Type::System, true, "Restoring system DNS settings");
|
||||||
restore_public_dns().await;
|
restore_public_dns().await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init_handle(app_handle: AppHandle) {
|
pub fn init_handle(app_handle: AppHandle) {
|
||||||
|
|||||||
Reference in New Issue
Block a user