diff --git a/src/ChooseAccountVC.mm b/src/ChooseAccountVC.mm
index ec7fff0..dce90d4 100644
--- a/src/ChooseAccountVC.mm
+++ b/src/ChooseAccountVC.mm
@@ -94,17 +94,21 @@
 
 -(const lrc::api::account::Info&) selectedAccount
 {
-    const auto& account = [accountSelectionManager_ savedAccount];
-    if(account.profileInfo.type == lrc::api::profile::Type::INVALID){
-        try {
-            auto accountId = accMdl_->getAccountList().at(0);
-            const auto& fallbackAccount = accMdl_->getAccountInfo(accMdl_->getAccountList().at(0));
+    try {
+        return [accountSelectionManager_ savedAccount];
+    } catch (std::out_of_range& e) { // Is thrown when no account are saved yet
+        auto accountList = accMdl_->getAccountList();
+        if (!accountList.empty()) {
+            const auto& fallbackAccount = accMdl_->getAccountInfo(accountList.at(0));
             return fallbackAccount;
-        } catch (std::out_of_range& e) { // Is thrown if account model has no account. We then return an invalid account
-            return account;
+        } else {
+            NSException* noAccEx = [NSException
+                                    exceptionWithName:@"NoAccountException"
+                                    reason:@"No account in AccountModel"
+                                    userInfo:nil];
+            @throw noAccEx;
         }
     }
-    return account;
 }
 
 -(void) updateMenu {
@@ -144,14 +148,19 @@
 
 -(void) updatePhoto
 {
-    auto& account = [self selectedAccount];
-    if(account.profileInfo.type == lrc::api::profile::Type::INVALID)
-        return;
+    @try {
+        auto& account = [self selectedAccount];
+        if(account.profileInfo.type == lrc::api::profile::Type::INVALID)
+            return;
 
-    QByteArray ba = QByteArray::fromStdString(account.profileInfo.avatar);
+        QByteArray ba = QByteArray::fromStdString(account.profileInfo.avatar);
 
-    QVariant photo = GlobalInstances::pixmapManipulator().personPhoto(ba);
-    [profileImage setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(photo))];
+        QVariant photo = GlobalInstances::pixmapManipulator().personPhoto(ba);
+        [profileImage setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(photo))];
+    }
+    @catch (NSException *ex) {
+        NSLog(@"Caught exception %@: %@", [ex name], [ex reason]);
+    }
 }
 
 -(NSString*) nameForAccount:(const lrc::api::account::Info&) account {
@@ -209,11 +218,16 @@
         return;
     }
     [self.view setHidden:NO];
-    auto& account = [self selectedAccount];
-    if(account.profileInfo.type == lrc::api::profile::Type::INVALID){
-        return;
+    @try {
+        auto& account = [self selectedAccount];
+        if(account.profileInfo.type == lrc::api::profile::Type::INVALID){
+            return;
+        }
+        [accountSelectionButton selectItemWithTitle:[self itemTitleForAccount:account]];
     }
-    [accountSelectionButton selectItemWithTitle:[self itemTitleForAccount:account]];
+    @catch (NSException *ex) {
+        NSLog(@"Caught exception %@: %@", [ex name], [ex reason]);
+    }
 }
 
 #pragma mark - NSPopUpButton item selection
diff --git a/src/RingWindowController.mm b/src/RingWindowController.mm
index e657fd3..a054095 100644
--- a/src/RingWindowController.mm
+++ b/src/RingWindowController.mm
@@ -108,7 +108,12 @@
 
     [currentCallVC initFrame];
     [offlineVC initFrame];
-    [smartViewVC setConversationModel: [chooseAccountVC selectedAccount].conversationModel.get()];
+    @try {
+        [smartViewVC setConversationModel: [chooseAccountVC selectedAccount].conversationModel.get()];
+    }
+    @catch (NSException *ex) {
+        NSLog(@"Caught exception %@: %@", [ex name], [ex reason]);
+    }
 
     // Fresh run, we need to make sure RingID appears
     [shareButton sendActionOn:NSLeftMouseDownMask];
@@ -168,25 +173,32 @@
  */
 - (void) updateRingID
 {
-    auto& account = [chooseAccountVC selectedAccount];
+    @try {
+        auto& account = [chooseAccountVC selectedAccount];
 
-    [ringIDLabel setStringValue:@""];
+        [ringIDLabel setStringValue:@""];
 
-    if(account.profileInfo.type != lrc::api::profile::Type::RING) {
-        self.hideRingID = YES;
-        return;
+        if(account.profileInfo.type != lrc::api::profile::Type::RING) {
+            self.hideRingID = YES;
+            return;
+        }
+        self.hideRingID = NO;
+        auto& registeredName = account.registeredName;
+        auto& ringID = account.profileInfo.uri;
+        NSString* uriToDisplay = nullptr;
+        if (!registeredName.empty()) {
+            uriToDisplay = @(registeredName.c_str());
+        } else {
+            uriToDisplay = @(ringID.c_str());
+        }
+        [ringIDLabel setStringValue:uriToDisplay];
+        [self drawQRCode:@(ringID.c_str())];
     }
-    self.hideRingID = NO;
-    auto& registeredName = account.registeredName;
-    auto& ringID = account.profileInfo.uri;
-    NSString* uriToDisplay = nullptr;
-    if (!registeredName.empty()) {
-        uriToDisplay = @(registeredName.c_str());
-    } else {
-        uriToDisplay = @(ringID.c_str());
+    @catch (NSException *ex) {
+        NSLog(@"Caught exception %@: %@", [ex name], [ex reason]);
+        self.hideRingID = NO;
+        [ringIDLabel setStringValue:@"No account available"];
     }
-    [ringIDLabel setStringValue:uriToDisplay];
-    [self drawQRCode:@(ringID.c_str())];
 }
 
 - (IBAction)shareRingID:(id)sender {
