diff --git a/src/storagecommands.cpp b/src/storagecommands.cpp
index 1ae2002..219c4dc 100644
--- a/src/storagecommands.cpp
+++ b/src/storagecommands.cpp
@@ -1,5 +1,5 @@
 /*
-// Copyright (c) 2017 2018 Intel Corporation
+// Copyright (c) 2017-2019 Intel Corporation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -804,24 +804,30 @@
     {
         return ipmi::responseUnspecifiedError();
     }
+    std::string& recordIDStr = targetEntryFields[0];
+    std::string& recordTypeStr = targetEntryFields[1];
+    std::string& eventDataStr = targetEntryFields[2];
 
-    uint16_t recordID = std::stoul(targetEntryFields[0]);
+    uint16_t recordID;
+    uint8_t recordType;
+    try
+    {
+        recordID = std::stoul(recordIDStr);
+        recordType = std::stoul(recordTypeStr, nullptr, 16);
+    }
+    catch (const std::invalid_argument&)
+    {
+        return ipmi::responseUnspecifiedError();
+    }
     uint16_t nextRecordID = getNextRecordID(recordID, selLogFiles);
-    uint8_t recordType = std::stoul(targetEntryFields[1], nullptr, 16);
     std::vector<uint8_t> eventDataBytes;
-    if (fromHexStr(targetEntryFields[2], eventDataBytes) < 0)
+    if (fromHexStr(eventDataStr, eventDataBytes) < 0)
     {
         return ipmi::responseUnspecifiedError();
     }
 
     if (recordType == intel_oem::ipmi::sel::systemEvent)
     {
-        // System type events have three additional fields
-        if (targetEntryFields.size() < 6)
-        {
-            return ipmi::responseUnspecifiedError();
-        }
-
         // Get the timestamp
         std::tm timeStruct = {};
         std::istringstream entryStream(entryTimestamp);
@@ -832,19 +838,46 @@
             timestamp = std::mktime(&timeStruct);
         }
 
-        // Get the generator ID
-        uint16_t generatorID = std::stoul(targetEntryFields[3], nullptr, 16);
-
         // Set the event message revision
         uint8_t evmRev = intel_oem::ipmi::sel::eventMsgRev;
 
-        // Get the sensor type, sensor number, and event type for the sensor
-        uint8_t sensorType = getSensorTypeFromPath(targetEntryFields[4]);
-        uint8_t sensorNum = getSensorNumberFromPath(targetEntryFields[4]);
-        uint7_t eventType = getSensorEventTypeFromPath(targetEntryFields[4]);
+        uint16_t generatorID = 0;
+        uint8_t sensorType = 0;
+        uint8_t sensorNum = 0xFF;
+        uint7_t eventType = 0;
+        bool eventDir = 0;
+        // System type events should have six fields
+        if (targetEntryFields.size() >= 6)
+        {
+            std::string& generatorIDStr = targetEntryFields[3];
+            std::string& sensorPath = targetEntryFields[4];
+            std::string& eventDirStr = targetEntryFields[5];
 
-        // Get the event direction
-        bool eventDir = std::stoul(targetEntryFields[5]) ? 0 : 1;
+            // Get the generator ID
+            try
+            {
+                generatorID = std::stoul(generatorIDStr, nullptr, 16);
+            }
+            catch (const std::invalid_argument&)
+            {
+                std::cerr << "Invalid Generator ID\n";
+            }
+
+            // Get the sensor type, sensor number, and event type for the sensor
+            sensorType = getSensorTypeFromPath(sensorPath);
+            sensorNum = getSensorNumberFromPath(sensorPath);
+            eventType = getSensorEventTypeFromPath(sensorPath);
+
+            // Get the event direction
+            try
+            {
+                eventDir = std::stoul(eventDirStr) ? 0 : 1;
+            }
+            catch (const std::invalid_argument&)
+            {
+                std::cerr << "Invalid Event Direction\n";
+            }
+        }
 
         // Only keep the eventData bytes that fit in the record
         std::array<uint8_t, intel_oem::ipmi::sel::systemEventSize> eventData{};
