diff --git a/mirai-core/src/commonMain/kotlin/network/impl/netty/HeartbeatFailedException.kt b/mirai-core/src/commonMain/kotlin/network/impl/netty/HeartbeatFailedException.kt
index deacafb70..503c4f229 100644
--- a/mirai-core/src/commonMain/kotlin/network/impl/netty/HeartbeatFailedException.kt
+++ b/mirai-core/src/commonMain/kotlin/network/impl/netty/HeartbeatFailedException.kt
@@ -12,6 +12,9 @@ package net.mamoe.mirai.internal.network.impl.netty
 import net.mamoe.mirai.internal.network.handler.selector.NetworkException
 
 internal class HeartbeatFailedException(
-    override val message: String?,
+    private val name: String, // kind of HB
     override val cause: Throwable? = null
-) : NetworkException(true)
\ No newline at end of file
+) : NetworkException(true) {
+    override val message: String = "Exception in $name job"
+    override fun toString(): String = "HeartbeatFailedException: $name, cause=$cause"
+}
\ No newline at end of file
diff --git a/mirai-core/src/commonMain/kotlin/network/impl/netty/NettyNetworkHandler.kt b/mirai-core/src/commonMain/kotlin/network/impl/netty/NettyNetworkHandler.kt
index b97222209..b74e5a655 100644
--- a/mirai-core/src/commonMain/kotlin/network/impl/netty/NettyNetworkHandler.kt
+++ b/mirai-core/src/commonMain/kotlin/network/impl/netty/NettyNetworkHandler.kt
@@ -355,7 +355,7 @@ internal open class NettyNetworkHandler(
 
         private val heartbeatJobs =
             context[HeartbeatScheduler].launchJobsIn(this@NettyNetworkHandler, this) { name, e ->
-                setState { StateClosed(HeartbeatFailedException("Exception in $name job", e)) }
+                setState { StateClosed(HeartbeatFailedException(name, e)) }
             }
 
         // we can also move them as observers if needed.