Blynk, but continue program if Blynk connection fails
You can try my Blynk_WM or Blynk_Async_WM library with their Blynk.begin() functions are not blocking.

Check Why using this Blynk_WiFiManager with MultiWiFi-MultiBlynk features
Why using this Blynk_WiFiManager with MultiWiFi-MultiBlynk features
You can see that the system automatically detects and connects to the best or avaiable WiFi APs and/or Blynk Servers, whenever interruption happens. This feature is very useful for systems requiring high degree of reliability.
Moreover, this Blynk.begin() is not a blocking call, so you can use it for critical functions requiring in loop().
Anyway, this is better for projects using Blynk just for GUI (graphical user interface).
In operation, if WiFi or Blynk connection is lost, Blynk.run() will try reconnecting automatically. Therefore, Blynk.run() must be called in the loop() function. Don't use:
void loop()
{
  if (Blynk.connected())
     Blynk.run();
     
  ...
}

just
void loop()
{
  Blynk.run();
  ...
}


It's also beneficial to search in Blynk Forum for more information and examples