net: NetworkMonitor: gracefully handle backend initialization failure

Change-Id: I1a22fd53e9905b6e5892573d1473d1f4e8969522
Refs: #4668
diff --git a/src/net/network-monitor.cpp b/src/net/network-monitor.cpp
index 4874dd4..89af14a 100644
--- a/src/net/network-monitor.cpp
+++ b/src/net/network-monitor.cpp
@@ -24,6 +24,9 @@
 
 #include "network-monitor.hpp"
 #include "ndn-cxx-config.hpp"
+#include "../util/logger.hpp"
+
+#include "detail/network-monitor-impl-noop.hpp"
 
 #if defined(NDN_CXX_HAVE_OSX_FRAMEWORKS)
 #include "detail/network-monitor-impl-osx.hpp"
@@ -32,15 +35,29 @@
 #include "detail/network-monitor-impl-netlink.hpp"
 #define NETWORK_MONITOR_IMPL_TYPE NetworkMonitorImplNetlink
 #else
-#include "detail/network-monitor-impl-noop.hpp"
 #define NETWORK_MONITOR_IMPL_TYPE NetworkMonitorImplNoop
 #endif
 
+NDN_LOG_INIT(ndn.NetworkMonitor);
+
 namespace ndn {
 namespace net {
 
+static unique_ptr<NetworkMonitorImpl>
+makeNetworkMonitorImpl(boost::asio::io_service& io)
+{
+  try {
+    return make_unique<NETWORK_MONITOR_IMPL_TYPE>(io);
+  }
+  catch (const std::runtime_error& e) {
+    NDN_LOG_WARN("failed to initialize " BOOST_STRINGIZE(NETWORK_MONITOR_IMPL_TYPE) ": " << e.what());
+    // fallback to dummy implementation
+    return make_unique<NetworkMonitorImplNoop>(io);
+  }
+}
+
 NetworkMonitor::NetworkMonitor(boost::asio::io_service& io)
-  : NetworkMonitor(make_unique<NETWORK_MONITOR_IMPL_TYPE>(io))
+  : NetworkMonitor(makeNetworkMonitorImpl(io))
 {
 }