Create individual exception methods.

This CL removes the LoadString method from CPDFXFA_Context and, instead,
creates individual exception methods for each of the loaded strings and
calls as needed.

BUG=pdfium:549

Change-Id: I1d975f01f13f45a885946a9952f24b13387dc3e4
Reviewed-on: https://pdfium-review.googlesource.com/2135
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
index 29888c3..113a74e 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -358,48 +358,6 @@
                                        wsEncode.c_str());
 }
 
-CFX_WideString CPDFXFA_Context::LoadString(int32_t iStringID) {
-  switch (iStringID) {
-    case XFA_IDS_INVAlID_PROP_SET:
-      return L"Invalid property set operation.";
-    case XFA_IDS_NOT_DEFAUL_VALUE:
-      return L" doesn't have a default property.";
-    case XFA_IDS_UNABLE_SET_LANGUAGE:
-      return L"Unable to set language value.";
-    case XFA_IDS_UNABLE_SET_NUMPAGES:
-      return L"Unable to set numPages value.";
-    case XFA_IDS_UNABLE_SET_PLATFORM:
-      return L"Unable to set platform value.";
-    case XFA_IDS_UNABLE_SET_VARIATION:
-      return L"Unable to set variation value.";
-    case XFA_IDS_UNABLE_SET_VERSION:
-      return L"Unable to set version value.";
-    case XFA_IDS_UNABLE_SET_READY:
-      return L"Unable to set ready value.";
-    case XFA_IDS_COMPILER_ERROR:
-      return L"Compiler error.";
-    case XFA_IDS_DIVIDE_ZERO:
-      return L"Divide by zero.";
-    case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT:
-      return L"An attempt was made to reference property '%s' of a non-object "
-             L"in SOM expression %s.";
-    case XFA_IDS_INDEX_OUT_OF_BOUNDS:
-      return L"Index value is out of bounds.";
-    case XFA_IDS_INCORRECT_NUMBER_OF_METHOD:
-      return L"Incorrect number of parameters calling method '%s'.";
-    case XFA_IDS_ARGUMENT_MISMATCH:
-      return L"Argument mismatch in property or function argument.";
-    case XFA_IDS_NOT_HAVE_PROPERTY:
-      return L"'%s' doesn't have property '%s'.";
-    case XFA_IDS_VIOLATE_BOUNDARY:
-      return L"The element [%s] has violated its allowable number of "
-             L"occurrences.";
-    case XFA_IDS_SERVER_DENY:
-      return L"Server does not permit.";
-  }
-  return L"";
-}
-
 IFWL_AdapterTimerMgr* CPDFXFA_Context::GetTimerMgr() {
   CXFA_FWLAdapterTimerMgr* pAdapter = nullptr;
   if (m_pFormFillEnv)
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.h b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
index 52b1689..de3f39c 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.h
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.h
@@ -80,7 +80,6 @@
                      const CFX_WideString& wsData,
                      const CFX_WideString& wsEncode) override;
 
-  CFX_WideString LoadString(int32_t iStringID) override;
   IFWL_AdapterTimerMgr* GetTimerMgr() override;
 
  protected:
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
index 862571e..7661679 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp
@@ -513,8 +513,7 @@
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Abs");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Abs");
     return;
   }
 
@@ -605,8 +604,7 @@
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ceil");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Ceil");
     return;
   }
 
@@ -638,7 +636,7 @@
 
       int32_t iLength = lengthValue->ToInteger();
       if (iLength <= 2) {
-        pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+        pContext->ThrowArgumentMismatchException();
         return;
       }
 
@@ -681,8 +679,7 @@
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Floor");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Floor");
     return;
   }
 
@@ -714,7 +711,7 @@
       argValue->GetObjectProperty("length", lengthValue.get());
       int32_t iLength = lengthValue->ToInteger();
       if (iLength <= 2) {
-        pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+        pContext->ThrowArgumentMismatchException();
         return;
       }
 
@@ -790,7 +787,7 @@
       argValue->GetObjectProperty("length", lengthValue.get());
       int32_t iLength = lengthValue->ToInteger();
       if (iLength <= 2) {
-        pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+        pContext->ThrowArgumentMismatchException();
         return;
       }
 
@@ -854,7 +851,7 @@
                             CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 2) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Mod");
+    pContext->ThrowParamCountMismatchException(L"Mod");
     return;
   }
 
@@ -870,12 +867,12 @@
   bool argTwoResult;
   FX_DOUBLE dDivisor = ExtractDouble(pThis, argTwo.get(), &argTwoResult);
   if (!argOneResult || !argTwoResult) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
   if (dDivisor == 0.0) {
-    pContext->ThrowException(XFA_IDS_DIVIDE_ZERO);
+    pContext->ThrowDivideByZeroException();
     return;
   }
 
@@ -890,7 +887,7 @@
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 2) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Round");
+    pContext->ThrowParamCountMismatchException(L"Round");
     return;
   }
 
@@ -903,7 +900,7 @@
   bool dValueRet;
   FX_DOUBLE dValue = ExtractDouble(pThis, argOne.get(), &dValueRet);
   if (!dValueRet) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -918,7 +915,7 @@
     bool dPrecisionRet;
     FX_DOUBLE dPrecision = ExtractDouble(pThis, argTwo.get(), &dPrecisionRet);
     if (!dPrecisionRet) {
-      pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+      pContext->ThrowArgumentMismatchException();
       return;
     }
 
@@ -955,7 +952,7 @@
       argValue->GetObjectProperty("length", lengthValue.get());
       int32_t iLength = lengthValue->ToInteger();
       if (iLength <= 2) {
-        pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+        pContext->ThrowArgumentMismatchException();
         return;
       }
 
@@ -1013,8 +1010,7 @@
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
   if (args.GetLength() != 0) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Date");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Date");
     return;
   }
 
@@ -1039,8 +1035,7 @@
                                  CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Date2Num");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Date2Num");
     return;
   }
 
@@ -1090,8 +1085,7 @@
                                 CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc > 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Date2Num");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Date2Num");
     return;
   }
 
@@ -1129,7 +1123,7 @@
                                     CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
     ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"IsoDate2Num");
+        ->ThrowParamCountMismatchException(L"IsoDate2Num");
     return;
   }
 
@@ -1150,8 +1144,7 @@
                                     CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 1) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
-                             L"IsoTime2Num");
+    pContext->ThrowParamCountMismatchException(L"IsoTime2Num");
     return;
   }
 
@@ -1210,7 +1203,7 @@
   int32_t argc = args.GetLength();
   if (argc > 2) {
     ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"LocalDateFmt");
+        ->ThrowParamCountMismatchException(L"LocalDateFmt");
     return;
   }
 
@@ -1248,7 +1241,7 @@
   int32_t argc = args.GetLength();
   if (argc > 2) {
     ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"LocalTimeFmt");
+        ->ThrowParamCountMismatchException(L"LocalTimeFmt");
     return;
   }
 
@@ -1285,8 +1278,7 @@
                                  CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Num2Date");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Num2Date");
     return;
   }
 
@@ -1428,7 +1420,7 @@
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 3) {
     ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Num2GMTime");
+        ->ThrowParamCountMismatchException(L"Num2GMTime");
     return;
   }
 
@@ -1475,8 +1467,7 @@
                                  CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Num2Time");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Num2Time");
     return;
   }
 
@@ -1522,8 +1513,7 @@
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
   if (args.GetLength() != 0) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Time");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Time");
     return;
   }
 
@@ -1541,8 +1531,7 @@
                                  CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Time2Num");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Time2Num");
     return;
   }
 
@@ -1632,8 +1621,7 @@
                                 CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc > 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"TimeFmt");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"TimeFmt");
     return;
   }
 
@@ -2364,7 +2352,7 @@
                             CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Apr");
+    pContext->ThrowParamCountMismatchException(L"Apr");
     return;
   }
 
@@ -2381,7 +2369,7 @@
   FX_DOUBLE nPayment = ValueToDouble(pThis, argTwo.get());
   FX_DOUBLE nPeriods = ValueToDouble(pThis, argThree.get());
   if (nPrincipal <= 0 || nPayment <= 0 || nPeriods <= 0) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2418,7 +2406,7 @@
                               CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"CTerm");
+    pContext->ThrowParamCountMismatchException(L"CTerm");
     return;
   }
 
@@ -2435,7 +2423,7 @@
   FX_FLOAT nFutureValue = ValueToFloat(pThis, argTwo.get());
   FX_FLOAT nInitAmount = ValueToFloat(pThis, argThree.get());
   if ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0)) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2450,7 +2438,7 @@
                            CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"FV");
+    pContext->ThrowParamCountMismatchException(L"FV");
     return;
   }
 
@@ -2467,7 +2455,7 @@
   FX_DOUBLE nRate = ValueToDouble(pThis, argTwo.get());
   FX_DOUBLE nPeriod = ValueToDouble(pThis, argThree.get());
   if ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0)) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2491,7 +2479,7 @@
                              CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 5) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"IPmt");
+    pContext->ThrowParamCountMismatchException(L"IPmt");
     return;
   }
 
@@ -2514,7 +2502,7 @@
   FX_FLOAT nNumberOfMonths = ValueToFloat(pThis, argFive.get());
   if ((nPrincipalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
       (nFirstMonth < 0) || (nNumberOfMonths < 0)) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2549,7 +2537,7 @@
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   int32_t argc = args.GetLength();
   if (argc < 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"NPV");
+    pContext->ThrowParamCountMismatchException(L"NPV");
     return;
   }
 
@@ -2564,7 +2552,7 @@
 
   FX_DOUBLE nRate = ValueToDouble(pThis, argValues[0].get());
   if (nRate <= 0) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2591,7 +2579,7 @@
                             CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Pmt");
+    pContext->ThrowParamCountMismatchException(L"Pmt");
     return;
   }
 
@@ -2608,7 +2596,7 @@
   FX_FLOAT nRate = ValueToFloat(pThis, argTwo.get());
   FX_FLOAT nPeriods = ValueToFloat(pThis, argThree.get());
   if ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0)) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2626,7 +2614,7 @@
                              CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 5) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"PPmt");
+    pContext->ThrowParamCountMismatchException(L"PPmt");
     return;
   }
 
@@ -2649,7 +2637,7 @@
   FX_FLOAT nNumberOfMonths = ValueToFloat(pThis, argFive.get());
   if ((nPrincipalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) ||
       (nFirstMonth < 0) || (nNumberOfMonths < 0)) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2660,7 +2648,7 @@
       FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth)));
   int32_t iEnd = std::min((int32_t)(nFirstMonth + nNumberOfMonths - 1), iNums);
   if (nPayment < nPrincipalAmount * nRateOfMonth) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2684,7 +2672,7 @@
                            CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"PV");
+    pContext->ThrowParamCountMismatchException(L"PV");
     return;
   }
 
@@ -2701,7 +2689,7 @@
   FX_DOUBLE nRate = ValueToDouble(pThis, argTwo.get());
   FX_DOUBLE nPeriod = ValueToDouble(pThis, argThree.get());
   if ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0)) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2719,7 +2707,7 @@
                              CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Rate");
+    pContext->ThrowParamCountMismatchException(L"Rate");
     return;
   }
 
@@ -2736,7 +2724,7 @@
   FX_FLOAT nPresent = ValueToFloat(pThis, argTwo.get());
   FX_FLOAT nTotalNumber = ValueToFloat(pThis, argThree.get());
   if ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0)) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2751,7 +2739,7 @@
                              CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Term");
+    pContext->ThrowParamCountMismatchException(L"Term");
     return;
   }
 
@@ -2768,7 +2756,7 @@
   FX_FLOAT nRate = ValueToFloat(pThis, argTwo.get());
   FX_FLOAT nFuture = ValueToFloat(pThis, argThree.get());
   if ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0)) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -2784,7 +2772,7 @@
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   int32_t argc = args.GetLength();
   if (argc < 2) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Choose");
+    pContext->ThrowParamCountMismatchException(L"Choose");
     return;
   }
 
@@ -2854,8 +2842,7 @@
                                const CFX_ByteStringC& szFuncName,
                                CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Exists");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Exists");
     return;
   }
   args.GetReturnValue()->SetInteger(args.GetValue(0)->IsObject());
@@ -2866,8 +2853,7 @@
                                  const CFX_ByteStringC& szFuncName,
                                  CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"HasValue");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"HasValue");
     return;
   }
 
@@ -2888,8 +2874,7 @@
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
   if (args.GetLength() < 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Oneof");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Oneof");
     return;
   }
 
@@ -2916,8 +2901,7 @@
                                const CFX_ByteStringC& szFuncName,
                                CFXJSE_Arguments& args) {
   if (args.GetLength() != 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Within");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Within");
     return;
   }
 
@@ -2954,8 +2938,7 @@
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
   if (args.GetLength() != 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"If");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"If");
     return;
   }
 
@@ -2970,7 +2953,7 @@
                              CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 1) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Eval");
+    pContext->ThrowParamCountMismatchException(L"Eval");
     return;
   }
 
@@ -3007,14 +2990,14 @@
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   if (args.GetLength() != 1) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ref");
+    pContext->ThrowParamCountMismatchException(L"Ref");
     return;
   }
 
   std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
   if (!argOne->IsArray() && !argOne->IsObject() && !argOne->IsBoolean() &&
       !argOne->IsString() && !argOne->IsNull() && !argOne->IsNumber()) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -3047,7 +3030,7 @@
       for (int32_t i = 0; i < 3; i++)
         delete rgValues[i];
 
-      pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+      pContext->ThrowArgumentMismatchException();
       return;
     }
 
@@ -3069,8 +3052,7 @@
                                  const CFX_ByteStringC& szFuncName,
                                  CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitType");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"UnitType");
     return;
   }
 
@@ -3183,8 +3165,7 @@
                                   CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitValue");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"UnitValue");
     return;
   }
 
@@ -3327,8 +3308,7 @@
                            const CFX_ByteStringC& szFuncName,
                            CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"At");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"At");
     return;
   }
 
@@ -3358,8 +3338,7 @@
                                CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Concat");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Concat");
     return;
   }
 
@@ -3391,8 +3370,7 @@
                                CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Decode");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Decode");
     return;
   }
 
@@ -3666,8 +3644,7 @@
                                CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Encode");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Encode");
     return;
   }
 
@@ -3985,7 +3962,7 @@
                                CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() < 2) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Format");
+    pContext->ThrowParamCountMismatchException(L"Format");
     return;
   }
 
@@ -4063,8 +4040,7 @@
                              const CFX_ByteStringC& szFuncName,
                              CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Left");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Left");
     return;
   }
 
@@ -4087,8 +4063,7 @@
                             const CFX_ByteStringC& szFuncName,
                             CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Len");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Len");
     return;
   }
 
@@ -4109,8 +4084,7 @@
                               CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Lower");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Lower");
     return;
   }
 
@@ -4148,8 +4122,7 @@
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ltrim");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Ltrim");
     return;
   }
 
@@ -4171,7 +4144,7 @@
                               CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 2) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Parse");
+    pContext->ThrowParamCountMismatchException(L"Parse");
     return;
   }
 
@@ -4302,8 +4275,7 @@
                                 CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 2 || argc > 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Replace");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Replace");
     return;
   }
 
@@ -4361,8 +4333,7 @@
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Right");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Right");
     return;
   }
 
@@ -4385,8 +4356,7 @@
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Rtrim");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Rtrim");
     return;
   }
 
@@ -4407,8 +4377,7 @@
                               const CFX_ByteStringC& szFuncName,
                               CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Space");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Space");
     return;
   }
 
@@ -4435,8 +4404,7 @@
                             CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Str");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Str");
     return;
   }
 
@@ -4552,8 +4520,7 @@
                               CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 3 || argc > 4) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Stuff");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Stuff");
     return;
   }
 
@@ -4602,8 +4569,7 @@
                                const CFX_ByteStringC& szFuncName,
                                CFXJSE_Arguments& args) {
   if (args.GetLength() != 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Substr");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Substr");
     return;
   }
 
@@ -4643,8 +4609,7 @@
                              CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 0 || argc > 1) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Uuid");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Uuid");
     return;
   }
 
@@ -4667,8 +4632,7 @@
                               CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 2) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Upper");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Upper");
     return;
   }
 
@@ -4708,8 +4672,7 @@
                                 CFXJSE_Arguments& args) {
   int32_t argc = args.GetLength();
   if (argc < 1 || argc > 3) {
-    ToJSContext(pThis, nullptr)
-        ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"WordNum");
+    ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"WordNum");
     return;
   }
 
@@ -4909,7 +4872,7 @@
                             CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 1) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Get");
+    pContext->ThrowParamCountMismatchException(L"Get");
     return;
   }
 
@@ -4942,7 +4905,7 @@
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   int32_t argc = args.GetLength();
   if (argc < 2 || argc > 5) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Post");
+    pContext->ThrowParamCountMismatchException(L"Post");
     return;
   }
 
@@ -4987,7 +4950,7 @@
           CFX_WideString::FromUTF8(bsContentType.AsStringC()),
           CFX_WideString::FromUTF8(bsEncode.AsStringC()),
           CFX_WideString::FromUTF8(bsHeader.AsStringC()), decodedResponse)) {
-    pContext->ThrowException(XFA_IDS_SERVER_DENY);
+    pContext->ThrowServerDeniedException();
     return;
   }
 
@@ -5003,7 +4966,7 @@
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   int32_t argc = args.GetLength();
   if (argc < 2 || argc > 3) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Put");
+    pContext->ThrowParamCountMismatchException(L"Put");
     return;
   }
 
@@ -5033,7 +4996,7 @@
           CFX_WideString::FromUTF8(bsURL.AsStringC()),
           CFX_WideString::FromUTF8(bsData.AsStringC()),
           CFX_WideString::FromUTF8(bsEncode.AsStringC()))) {
-    pContext->ThrowException(XFA_IDS_SERVER_DENY);
+    pContext->ThrowServerDeniedException();
     return;
   }
 
@@ -5046,7 +5009,7 @@
                                               CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 2) {
-    pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
+    pContext->ThrowCompilerErrorException();
     return;
   }
 
@@ -5064,7 +5027,7 @@
       for (int32_t i = 2; i < iLeftLength; i++) {
         lValue->GetObjectPropertyByIdx(i, jsObjectValue.get());
         if (!SetObjectDefaultValue(jsObjectValue.get(), rValue.get())) {
-          pContext->ThrowException(XFA_IDS_NOT_DEFAUL_VALUE);
+          pContext->ThrowNoDefaultPropertyException(szFuncName);
           return;
         }
       }
@@ -5077,7 +5040,7 @@
     }
   } else if (lValue->IsObject()) {
     if (!SetObjectDefaultValue(lValue.get(), rValue.get())) {
-      pContext->ThrowException(XFA_IDS_NOT_DEFAUL_VALUE);
+      pContext->ThrowNoDefaultPropertyException(szFuncName);
       return;
     }
   }
@@ -5089,7 +5052,7 @@
                                             const CFX_ByteStringC& szFuncName,
                                             CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5110,7 +5073,7 @@
                                              const CFX_ByteStringC& szFuncName,
                                              CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5131,7 +5094,7 @@
                                           const CFX_ByteStringC& szFuncName,
                                           CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5164,7 +5127,7 @@
                                              const CFX_ByteStringC& szFuncName,
                                              CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5224,7 +5187,7 @@
                                       const CFX_ByteStringC& szFuncName,
                                       CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5251,7 +5214,7 @@
                                            const CFX_ByteStringC& szFuncName,
                                            CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5279,7 +5242,7 @@
                                          const CFX_ByteStringC& szFuncName,
                                          CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5306,7 +5269,7 @@
                                               const CFX_ByteStringC& szFuncName,
                                               CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5334,7 +5297,7 @@
                                       const CFX_ByteStringC& szFuncName,
                                       CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5356,7 +5319,7 @@
                                        const CFX_ByteStringC& szFuncName,
                                        CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5377,7 +5340,7 @@
                                           const CFX_ByteStringC& szFuncName,
                                           CFXJSE_Arguments& args) {
   if (args.GetLength() != 2) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5399,7 +5362,7 @@
                                         CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 2) {
-    pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
+    pContext->ThrowCompilerErrorException();
     return;
   }
 
@@ -5412,7 +5375,7 @@
 
   FX_DOUBLE second = ValueToDouble(pThis, argSecond.get());
   if (second == 0.0) {
-    pContext->ThrowException(XFA_IDS_DIVIDE_ZERO);
+    pContext->ThrowDivideByZeroException();
     return;
   }
 
@@ -5425,7 +5388,7 @@
                                           const CFX_ByteStringC& szFuncName,
                                           CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5442,7 +5405,7 @@
                                           const CFX_ByteStringC& szFuncName,
                                           CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5459,7 +5422,7 @@
                                              const CFX_ByteStringC& szFuncName,
                                              CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5481,7 +5444,7 @@
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   int32_t argc = args.GetLength();
   if (argc < 4 || argc > 5) {
-    pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
+    pContext->ThrowCompilerErrorException();
     return;
   }
 
@@ -5522,12 +5485,9 @@
       }
     }
     if (iCounter < 1) {
-      CFX_WideString wsPropertyName =
-          CFX_WideString::FromUTF8(szName.AsStringC());
-      CFX_WideString wsSomExpression =
-          CFX_WideString::FromUTF8(szSomExp.AsStringC());
-      pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
-                               wsPropertyName.c_str(), wsSomExpression.c_str());
+      pContext->ThrowPropertyNotInObjectException(
+          CFX_WideString::FromUTF8(szName.AsStringC()),
+          CFX_WideString::FromUTF8(szSomExp.AsStringC()));
       return;
     }
 
@@ -5581,12 +5541,9 @@
                           resoveNodeRS, true, szName.IsEmpty());
   }
   if (iRet < 1) {
-    CFX_WideString wsPropertyName =
-        CFX_WideString::FromUTF8(szName.AsStringC());
-    CFX_WideString wsSomExpression =
-        CFX_WideString::FromUTF8(szSomExp.AsStringC());
-    pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
-                             wsPropertyName.c_str(), wsSomExpression.c_str());
+    pContext->ThrowPropertyNotInObjectException(
+        CFX_WideString::FromUTF8(szName.AsStringC()),
+        CFX_WideString::FromUTF8(szSomExp.AsStringC()));
     return;
   }
 
@@ -5626,7 +5583,7 @@
   v8::Isolate* pIsolate = pContext->GetScriptRuntime();
   int32_t argc = args.GetLength();
   if (argc < 4 || argc > 5) {
-    pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
+    pContext->ThrowCompilerErrorException();
     return;
   }
 
@@ -5664,12 +5621,9 @@
       }
     }
     if (iCounter < 1) {
-      CFX_WideString wsPropertyName =
-          CFX_WideString::FromUTF8(szName.AsStringC());
-      CFX_WideString wsSomExpression =
-          CFX_WideString::FromUTF8(szSomExp.AsStringC());
-      pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
-                               wsPropertyName.c_str(), wsSomExpression.c_str());
+      pContext->ThrowPropertyNotInObjectException(
+          CFX_WideString::FromUTF8(szName.AsStringC()),
+          CFX_WideString::FromUTF8(szSomExp.AsStringC()));
       return;
     }
 
@@ -5719,12 +5673,9 @@
                           resoveNodeRS, false);
   }
   if (iRet < 1) {
-    CFX_WideString wsPropertyName =
-        CFX_WideString::FromUTF8(szName.AsStringC());
-    CFX_WideString wsSomExpression =
-        CFX_WideString::FromUTF8(szSomExp.AsStringC());
-    pContext->ThrowException(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT,
-                             wsPropertyName.c_str(), wsSomExpression.c_str());
+    pContext->ThrowPropertyNotInObjectException(
+        CFX_WideString::FromUTF8(szName.AsStringC()),
+        CFX_WideString::FromUTF8(szSomExp.AsStringC()));
     return;
   }
 
@@ -5763,7 +5714,7 @@
                                          CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 1) {
-    pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Eval");
+    pContext->ThrowParamCountMismatchException(L"Eval");
     return;
   }
 
@@ -5771,7 +5722,7 @@
   CFX_ByteString argString;
   ValueToUTF8String(argOne.get(), argString);
   if (argString.IsEmpty()) {
-    pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    pContext->ThrowArgumentMismatchException();
     return;
   }
 
@@ -5781,7 +5732,7 @@
   CXFA_FM2JSContext::Translate(scriptString.AsStringC(), wsJavaScriptBuf,
                                wsError);
   if (!wsError.IsEmpty()) {
-    pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
+    pContext->ThrowCompilerErrorException();
     return;
   }
 
@@ -5822,7 +5773,7 @@
                                      CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 1) {
-    pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
+    pContext->ThrowCompilerErrorException();
     return;
   }
 
@@ -5856,7 +5807,7 @@
                                      const CFX_ByteStringC& szFuncName,
                                      CFXJSE_Arguments& args) {
   if (args.GetLength() != 1) {
-    ToJSContext(pThis, nullptr)->ThrowException(XFA_IDS_COMPILER_ERROR);
+    ToJSContext(pThis, nullptr)->ThrowCompilerErrorException();
     return;
   }
 
@@ -5883,7 +5834,7 @@
                                       CFXJSE_Arguments& args) {
   CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
   if (args.GetLength() != 1) {
-    pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
+    pContext->ThrowCompilerErrorException();
     return;
   }
 
@@ -5928,7 +5879,7 @@
   std::unique_ptr<CFXJSE_Value> objectValue(new CFXJSE_Value(pIsolate));
   argOne->GetObjectPropertyByIdx(2, objectValue.get());
   if (objectValue->IsNull()) {
-    pContext->ThrowException(XFA_IDS_COMPILER_ERROR);
+    pContext->ThrowCompilerErrorException();
     return;
   }
   args.GetReturnValue()->Assign(argOne.get());
@@ -6509,14 +6460,47 @@
   pValue->Assign(m_pValue.get());
 }
 
-void CXFA_FM2JSContext::ThrowException(int32_t iStringID, ...) {
-  IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
-  ASSERT(pAppProvider);
+void CXFA_FM2JSContext::ThrowNoDefaultPropertyException(
+    const CFX_ByteStringC& name) const {
+  ThrowException(L"%s doesn't have a default property.", name.c_str());
+}
 
+void CXFA_FM2JSContext::ThrowCompilerErrorException() const {
+  ThrowException(L"Compiler error.");
+}
+
+void CXFA_FM2JSContext::ThrowDivideByZeroException() const {
+  ThrowException(L"Divide by zero.");
+}
+
+void CXFA_FM2JSContext::ThrowServerDeniedException() const {
+  ThrowException(L"Server does not permit operation.");
+}
+
+void CXFA_FM2JSContext::ThrowPropertyNotInObjectException(
+    const CFX_WideString& name,
+    const CFX_WideString& exp) const {
+  ThrowException(
+      L"An attempt was made to reference property '%s' of a non-object "
+      L"in SOM expression %s.",
+      name.c_str(), exp.c_str());
+}
+
+void CXFA_FM2JSContext::ThrowParamCountMismatchException(
+    const CFX_WideString& method) const {
+  ThrowException(L"Incorrect number of parameters calling method '%s'.",
+                 method.c_str());
+}
+
+void CXFA_FM2JSContext::ThrowArgumentMismatchException() const {
+  ThrowException(L"Argument mismatch in property or function argument.");
+}
+
+void CXFA_FM2JSContext::ThrowException(const FX_WCHAR* str, ...) const {
   CFX_WideString wsMessage;
   va_list arg_ptr;
-  va_start(arg_ptr, iStringID);
-  wsMessage.FormatV(pAppProvider->LoadString(iStringID).c_str(), arg_ptr);
+  va_start(arg_ptr, str);
+  wsMessage.FormatV(str, arg_ptr);
   va_end(arg_ptr);
   FXJSE_ThrowMessage(
       FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC());
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.h b/xfa/fxfa/fm2js/xfa_fm2jscontext.h
index f6be186..413cb30 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.h
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.h
@@ -452,7 +452,16 @@
  private:
   v8::Isolate* GetScriptRuntime() const { return m_pIsolate; }
   CXFA_Document* GetDocument() const { return m_pDocument; }
-  void ThrowException(int32_t iStringID, ...);
+
+  void ThrowNoDefaultPropertyException(const CFX_ByteStringC& name) const;
+  void ThrowCompilerErrorException() const;
+  void ThrowDivideByZeroException() const;
+  void ThrowServerDeniedException() const;
+  void ThrowPropertyNotInObjectException(const CFX_WideString& name,
+                                         const CFX_WideString& exp) const;
+  void ThrowArgumentMismatchException() const;
+  void ThrowParamCountMismatchException(const CFX_WideString& method) const;
+  void ThrowException(const FX_WCHAR* str, ...) const;
 
   v8::Isolate* m_pIsolate;
   CFXJSE_Class* m_pFMClass;
diff --git a/xfa/fxfa/fxfa.h b/xfa/fxfa/fxfa.h
index 2656947..dd5fc0f 100644
--- a/xfa/fxfa/fxfa.h
+++ b/xfa/fxfa/fxfa.h
@@ -39,24 +39,6 @@
 #define XFA_IDNo 3
 #define XFA_IDYes 4
 
-#define XFA_IDS_INVAlID_PROP_SET 13
-#define XFA_IDS_NOT_DEFAUL_VALUE 14
-#define XFA_IDS_UNABLE_SET_LANGUAGE 15
-#define XFA_IDS_UNABLE_SET_NUMPAGES 16
-#define XFA_IDS_UNABLE_SET_PLATFORM 17
-#define XFA_IDS_UNABLE_SET_VARIATION 19
-#define XFA_IDS_UNABLE_SET_VERSION 20
-#define XFA_IDS_UNABLE_SET_READY 21
-#define XFA_IDS_COMPILER_ERROR 35
-#define XFA_IDS_DIVIDE_ZERO 44
-#define XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT 61
-#define XFA_IDS_INDEX_OUT_OF_BOUNDS 64
-#define XFA_IDS_INCORRECT_NUMBER_OF_METHOD 65
-#define XFA_IDS_ARGUMENT_MISMATCH 66
-#define XFA_IDS_NOT_HAVE_PROPERTY 70
-#define XFA_IDS_VIOLATE_BOUNDARY 72
-#define XFA_IDS_SERVER_DENY 73
-
 #define XFA_DOCVIEW_View 0x00000000
 #define XFA_DOCVIEW_MasterPage 0x00000001
 #define XFA_DOCVIEW_Design 0x00000002
@@ -242,7 +224,6 @@
                              const CFX_WideString& wsData,
                              const CFX_WideString& wsEncode) = 0;
 
-  virtual CFX_WideString LoadString(int32_t iStringID) = 0;
   virtual IFWL_AdapterTimerMgr* GetTimerMgr() = 0;
 };
 
diff --git a/xfa/fxfa/parser/cscript_hostpseudomodel.cpp b/xfa/fxfa/parser/cscript_hostpseudomodel.cpp
index b455966..97f16f0 100644
--- a/xfa/fxfa/parser/cscript_hostpseudomodel.cpp
+++ b/xfa/fxfa/parser/cscript_hostpseudomodel.cpp
@@ -34,13 +34,6 @@
 
 CScript_HostPseudoModel::~CScript_HostPseudoModel() {}
 
-void CScript_HostPseudoModel::LoadString(CFXJSE_Value* pValue,
-                                         CXFA_FFNotify* pNotify,
-                                         uint32_t dwFlag) {
-  pValue->SetString(
-      FX_UTF8Encode(pNotify->GetAppProvider()->LoadString(dwFlag)).AsStringC());
-}
-
 void CScript_HostPseudoModel::AppType(CFXJSE_Value* pValue,
                                       bool bSetting,
                                       XFA_ATTRIBUTE eAttribute) {
@@ -48,7 +41,7 @@
   if (!pNotify)
     return;
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+    ThrowInvalidPropertyException();
     return;
   }
   pValue->SetString("Exchange");
@@ -89,11 +82,10 @@
                                        bool bSetting,
                                        XFA_ATTRIBUTE eAttribute) {
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-  if (!pNotify) {
+  if (!pNotify)
     return;
-  }
   if (bSetting) {
-    ThrowException(XFA_IDS_UNABLE_SET_LANGUAGE);
+    ThrowSetLanguageException();
     return;
   }
   pValue->SetString(
@@ -109,7 +101,7 @@
   }
   CXFA_FFDoc* hDoc = pNotify->GetHDOC();
   if (bSetting) {
-    ThrowException(XFA_IDS_UNABLE_SET_NUMPAGES);
+    ThrowSetNumPagesException();
     return;
   }
   pValue->SetInteger(pNotify->GetDocEnvironment()->CountPages(hDoc));
@@ -119,11 +111,10 @@
                                        bool bSetting,
                                        XFA_ATTRIBUTE eAttribute) {
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-  if (!pNotify) {
+  if (!pNotify)
     return;
-  }
   if (bSetting) {
-    ThrowException(XFA_IDS_UNABLE_SET_PLATFORM);
+    ThrowSetPlatformException();
     return;
   }
   pValue->SetString(
@@ -176,7 +167,7 @@
   if (!pNotify)
     return;
   if (bSetting) {
-    ThrowException(XFA_IDS_UNABLE_SET_VARIATION);
+    ThrowSetVariationException();
     return;
   }
   pValue->SetString("Full");
@@ -190,7 +181,7 @@
     return;
   }
   if (bSetting) {
-    ThrowException(XFA_IDS_UNABLE_SET_VERSION);
+    ThrowSetVersionException();
     return;
   }
   pValue->SetString("11");
@@ -204,7 +195,7 @@
     return;
   }
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+    ThrowInvalidPropertyException();
     return;
   }
   pValue->SetString(
@@ -217,7 +208,7 @@
   }
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"gotoURL");
+    ThrowParamCountMismatchException(L"gotoURL");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -238,7 +229,7 @@
   }
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"openList");
+    ThrowParamCountMismatchException(L"openList");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -285,7 +276,7 @@
 void CScript_HostPseudoModel::Response(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 4) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"response");
+    ThrowParamCountMismatchException(L"response");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -349,7 +340,7 @@
 void CScript_HostPseudoModel::ResetData(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 0 || iLength > 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resetData");
+    ThrowParamCountMismatchException(L"resetData");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -400,7 +391,7 @@
   }
   int32_t iLength = pArguments->GetLength();
   if (iLength < 0 || iLength > 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"beep");
+    ThrowParamCountMismatchException(L"beep");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -419,7 +410,7 @@
   }
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setFocus");
+    ThrowParamCountMismatchException(L"setFocus");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -472,7 +463,7 @@
   }
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 4) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"messageBox");
+    ThrowParamCountMismatchException(L"messageBox");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -524,7 +515,7 @@
   }
   std::unique_ptr<CFXJSE_Value> pValueArg(pArguments->GetValue(iArgIndex));
   if (!pValueArg->IsString() && bIsJsType) {
-    ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+    ThrowArgumentMismatchException();
     return false;
   }
   if (pValueArg->IsNull()) {
@@ -545,7 +536,7 @@
   }
   int32_t iLength = pArguments->GetLength();
   if (iLength != 8) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"print");
+    ThrowParamCountMismatchException(L"print");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -611,7 +602,7 @@
 void CScript_HostPseudoModel::ImportData(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 0 || iLength > 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"importData");
+    ThrowParamCountMismatchException(L"importData");
     return;
   }
   // Not implemented.
@@ -620,7 +611,7 @@
 void CScript_HostPseudoModel::ExportData(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 0 || iLength > 2) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"exportData");
+    ThrowParamCountMismatchException(L"exportData");
     return;
   }
   CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
@@ -685,3 +676,23 @@
   if (pValue)
     pValue->SetString(FX_UTF8Encode(wsDataTime).AsStringC());
 }
+
+void CScript_HostPseudoModel::ThrowSetLanguageException() const {
+  ThrowException(L"Unable to set language value.");
+}
+
+void CScript_HostPseudoModel::ThrowSetNumPagesException() const {
+  ThrowException(L"Unable to set numPages value.");
+}
+
+void CScript_HostPseudoModel::ThrowSetPlatformException() const {
+  ThrowException(L"Unable to set platform value.");
+}
+
+void CScript_HostPseudoModel::ThrowSetVariationException() const {
+  ThrowException(L"Unable to set variation value.");
+}
+
+void CScript_HostPseudoModel::ThrowSetVersionException() const {
+  ThrowException(L"Unable to set version value.");
+}
diff --git a/xfa/fxfa/parser/cscript_hostpseudomodel.h b/xfa/fxfa/parser/cscript_hostpseudomodel.h
index 76c910b..7d24a1d 100644
--- a/xfa/fxfa/parser/cscript_hostpseudomodel.h
+++ b/xfa/fxfa/parser/cscript_hostpseudomodel.h
@@ -51,12 +51,16 @@
   void CurrentDateTime(CFXJSE_Arguments* pArguments);
 
  protected:
-  void LoadString(CFXJSE_Value* pValue,
-                  CXFA_FFNotify* pNotify,
-                  uint32_t dwFlag);
   bool ValidateArgsForMsg(CFXJSE_Arguments* pArguments,
                           int32_t iArgIndex,
                           CFX_WideString& wsValue);
+
+ private:
+  void ThrowSetLanguageException() const;
+  void ThrowSetNumPagesException() const;
+  void ThrowSetPlatformException() const;
+  void ThrowSetVariationException() const;
+  void ThrowSetVersionException() const;
 };
 
 #endif  // XFA_FXFA_PARSER_CSCRIPT_HOSTPSEUDOMODEL_H_
diff --git a/xfa/fxfa/parser/cscript_layoutpseudomodel.cpp b/xfa/fxfa/parser/cscript_layoutpseudomodel.cpp
index a9c6366..a1d1ca5 100644
--- a/xfa/fxfa/parser/cscript_layoutpseudomodel.cpp
+++ b/xfa/fxfa/parser/cscript_layoutpseudomodel.cpp
@@ -39,7 +39,7 @@
     return;
   }
   if (bSetting) {
-    ThrowException(XFA_IDS_UNABLE_SET_READY);
+    ThrowSetReadyException();
     return;
   }
   int32_t iStatus = pNotify->GetLayoutStatus();
@@ -65,7 +65,7 @@
         methodName = L"y";
         break;
     }
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName);
+    ThrowParamCountMismatchException(methodName);
     return;
   }
   CXFA_Node* pNode = nullptr;
@@ -177,7 +177,7 @@
 void CScript_LayoutPseudoModel::PageSpan(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"pageSpan");
+    ThrowParamCountMismatchException(L"pageSpan");
     return;
   }
   CXFA_Node* pNode = nullptr;
@@ -343,7 +343,7 @@
 void CScript_LayoutPseudoModel::PageContent(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 3) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"pageContent");
+    ThrowParamCountMismatchException(L"pageContent");
     return;
   }
   int32_t iIndex = 0;
@@ -411,7 +411,7 @@
 
 void CScript_LayoutPseudoModel::AbsPageInBatch(CFXJSE_Arguments* pArguments) {
   if (pArguments->GetLength() != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"absPageInBatch");
+    ThrowParamCountMismatchException(L"absPageInBatch");
     return;
   }
 
@@ -422,7 +422,7 @@
 
 void CScript_LayoutPseudoModel::SheetInBatch(CFXJSE_Arguments* pArguments) {
   if (pArguments->GetLength() != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"sheetInBatch");
+    ThrowParamCountMismatchException(L"sheetInBatch");
     return;
   }
 
@@ -456,7 +456,7 @@
     } else {
       methodName = L"page";
     }
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName);
+    ThrowParamCountMismatchException(methodName);
     return;
   }
   CXFA_Node* pNode = nullptr;
@@ -481,3 +481,7 @@
   if (pValue)
     pValue->SetInteger(bAbsPage ? iPage : iPage + 1);
 }
+
+void CScript_LayoutPseudoModel::ThrowSetReadyException() const {
+  ThrowException(L"Unable to set ready value.");
+}
diff --git a/xfa/fxfa/parser/cscript_layoutpseudomodel.h b/xfa/fxfa/parser/cscript_layoutpseudomodel.h
index ad64417..55a00db 100644
--- a/xfa/fxfa/parser/cscript_layoutpseudomodel.h
+++ b/xfa/fxfa/parser/cscript_layoutpseudomodel.h
@@ -55,6 +55,9 @@
                    bool bOnPageArea,
                    CXFA_NodeArray& retArray);
   void PageImp(CFXJSE_Arguments* pArguments, bool bAbsPage);
+
+ private:
+  void ThrowSetReadyException() const;
 };
 
 #endif  // XFA_FXFA_PARSER_CSCRIPT_LAYOUTPSEUDOMODEL_H_
diff --git a/xfa/fxfa/parser/cscript_signaturepseudomodel.cpp b/xfa/fxfa/parser/cscript_signaturepseudomodel.cpp
index 391f3be..e5874a6 100644
--- a/xfa/fxfa/parser/cscript_signaturepseudomodel.cpp
+++ b/xfa/fxfa/parser/cscript_signaturepseudomodel.cpp
@@ -26,7 +26,7 @@
 void CScript_SignaturePseudoModel::Verify(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 4) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"verify");
+    ThrowParamCountMismatchException(L"verify");
     return;
   }
 
@@ -38,7 +38,7 @@
 void CScript_SignaturePseudoModel::Sign(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 3 || iLength > 7) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"sign");
+    ThrowParamCountMismatchException(L"sign");
     return;
   }
 
@@ -49,7 +49,7 @@
 
 void CScript_SignaturePseudoModel::Enumerate(CFXJSE_Arguments* pArguments) {
   if (pArguments->GetLength() != 0) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"enumerate");
+    ThrowParamCountMismatchException(L"enumerate");
     return;
   }
   return;
@@ -58,7 +58,7 @@
 void CScript_SignaturePseudoModel::Clear(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 2) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clear");
+    ThrowParamCountMismatchException(L"clear");
     return;
   }
 
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index cabf87f..1bde816 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -994,7 +994,7 @@
 void CXFA_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resolveNode");
+    ThrowParamCountMismatchException(L"resolveNode");
     return;
   }
   CFX_WideString wsExpression =
@@ -1037,7 +1037,7 @@
 void CXFA_Node::Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resolveNodes");
+    ThrowParamCountMismatchException(L"resolveNodes");
     return;
   }
   CFX_WideString wsExpression =
@@ -1090,14 +1090,15 @@
                                      bool bSetting,
                                      XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    uint32_t dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
-    CFX_WideString wsName;
-    GetAttribute(XFA_ATTRIBUTE_Name, wsName);
-    CFX_WideString wsExpression = wsName + FX_WSTRC(L"[*]");
-    Script_Som_ResolveNodeList(pValue, wsExpression, dwFlag);
+    ThrowInvalidPropertyException();
+    return;
   }
+
+  uint32_t dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
+  CFX_WideString wsName;
+  GetAttribute(XFA_ATTRIBUTE_Name, wsName);
+  CFX_WideString wsExpression = wsName + FX_WSTRC(L"[*]");
+  Script_Som_ResolveNodeList(pValue, wsExpression, dwFlag);
 }
 
 void CXFA_Node::Script_TreeClass_Nodes(CFXJSE_Value* pValue,
@@ -1120,65 +1121,67 @@
                                           bool bSetting,
                                           XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    uint32_t dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
-    CFX_WideString wsExpression =
-        FX_WSTRC(L"#") + GetClassName() + FX_WSTRC(L"[*]");
-    Script_Som_ResolveNodeList(pValue, wsExpression, dwFlag);
+    ThrowInvalidPropertyException();
+    return;
   }
+
+  uint32_t dwFlag = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_ALL;
+  CFX_WideString wsExpression =
+      FX_WSTRC(L"#") + GetClassName() + FX_WSTRC(L"[*]");
+  Script_Som_ResolveNodeList(pValue, wsExpression, dwFlag);
 }
 
 void CXFA_Node::Script_TreeClass_Parent(CFXJSE_Value* pValue,
                                         bool bSetting,
                                         XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+    ThrowInvalidPropertyException();
+    return;
+  }
+  CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent);
+  if (pParent) {
+    pValue->Assign(m_pDocument->GetScriptContext()->GetJSValueFromMap(pParent));
   } else {
-    CXFA_Node* pParent = GetNodeItem(XFA_NODEITEM_Parent);
-    if (pParent) {
-      pValue->Assign(
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(pParent));
-    } else {
-      pValue->SetNull();
-    }
+    pValue->SetNull();
   }
 }
 
 void CXFA_Node::Script_TreeClass_Index(CFXJSE_Value* pValue,
                                        bool bSetting,
                                        XFA_ATTRIBUTE eAttribute) {
-  if (bSetting)
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  else
-    pValue->SetInteger(GetNodeSameNameIndex());
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
+  }
+  pValue->SetInteger(GetNodeSameNameIndex());
 }
 
 void CXFA_Node::Script_TreeClass_ClassIndex(CFXJSE_Value* pValue,
                                             bool bSetting,
                                             XFA_ATTRIBUTE eAttribute) {
-  if (bSetting)
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  else
-    pValue->SetInteger(GetNodeSameClassIndex());
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
+  }
+  pValue->SetInteger(GetNodeSameClassIndex());
 }
 
 void CXFA_Node::Script_TreeClass_SomExpression(CFXJSE_Value* pValue,
                                                bool bSetting,
                                                XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CFX_WideString wsSOMExpression;
-    GetSOMExpression(wsSOMExpression);
-    pValue->SetString(FX_UTF8Encode(wsSOMExpression).AsStringC());
+    ThrowInvalidPropertyException();
+    return;
   }
+  CFX_WideString wsSOMExpression;
+  GetSOMExpression(wsSOMExpression);
+  pValue->SetString(FX_UTF8Encode(wsSOMExpression).AsStringC());
 }
 
 void CXFA_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"applyXSL");
+    ThrowParamCountMismatchException(L"applyXSL");
     return;
   }
   CFX_WideString wsExpression =
@@ -1191,7 +1194,7 @@
 void CXFA_Node::Script_NodeClass_AssignNode(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 3) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"assignNode");
+    ThrowParamCountMismatchException(L"assignNode");
     return;
   }
   CFX_WideString wsExpression;
@@ -1215,7 +1218,7 @@
 void CXFA_Node::Script_NodeClass_Clone(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clone");
+    ThrowParamCountMismatchException(L"clone");
     return;
   }
   bool bClone = !!pArguments->GetInt32(0);
@@ -1227,7 +1230,7 @@
 void CXFA_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getAttribute");
+    ThrowParamCountMismatchException(L"getAttribute");
     return;
   }
   CFX_WideString wsExpression =
@@ -1242,7 +1245,7 @@
 void CXFA_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 2) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getElement");
+    ThrowParamCountMismatchException(L"getElement");
     return;
   }
   CFX_WideString wsExpression;
@@ -1261,7 +1264,7 @@
     CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 3) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isPropertySpecified");
+    ThrowParamCountMismatchException(L"isPropertySpecified");
     return;
   }
   CFX_WideString wsExpression;
@@ -1297,7 +1300,7 @@
 void CXFA_Node::Script_NodeClass_LoadXML(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 3) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"loadXML");
+    ThrowParamCountMismatchException(L"loadXML");
     return;
   }
   CFX_WideString wsExpression;
@@ -1417,13 +1420,13 @@
 void CXFA_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 0 || iLength > 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"saveXML");
+    ThrowParamCountMismatchException(L"saveXML");
     return;
   }
   bool bPrettyMode = false;
   if (iLength == 1) {
     if (pArguments->GetUTF8String(0) != "pretty") {
-      ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
+      ThrowArgumentMismatchException();
       return;
     }
     bPrettyMode = true;
@@ -1471,7 +1474,7 @@
 void CXFA_Node::Script_NodeClass_SetAttribute(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 2) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setAttribute");
+    ThrowParamCountMismatchException(L"setAttribute");
     return;
   }
   CFX_WideString wsAttributeValue =
@@ -1484,7 +1487,7 @@
 void CXFA_Node::Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1 && iLength != 2) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setElement");
+    ThrowParamCountMismatchException(L"setElement");
     return;
   }
   CXFA_Node* pNode = nullptr;
@@ -1502,61 +1505,64 @@
                                     bool bSetting,
                                     XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CFX_WideString wsNameSpace;
-    TryNamespace(wsNameSpace);
-    pValue->SetString(FX_UTF8Encode(wsNameSpace).AsStringC());
+    ThrowInvalidPropertyException();
+    return;
   }
+
+  CFX_WideString wsNameSpace;
+  TryNamespace(wsNameSpace);
+  pValue->SetString(FX_UTF8Encode(wsNameSpace).AsStringC());
 }
 
 void CXFA_Node::Script_NodeClass_Model(CFXJSE_Value* pValue,
                                        bool bSetting,
                                        XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    pValue->Assign(
-        m_pDocument->GetScriptContext()->GetJSValueFromMap(GetModelNode()));
+    ThrowInvalidPropertyException();
+    return;
   }
+  pValue->Assign(
+      m_pDocument->GetScriptContext()->GetJSValueFromMap(GetModelNode()));
 }
 
 void CXFA_Node::Script_NodeClass_IsContainer(CFXJSE_Value* pValue,
                                              bool bSetting,
                                              XFA_ATTRIBUTE eAttribute) {
-  if (bSetting)
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  else
-    pValue->SetBoolean(IsContainerNode());
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
+  }
+  pValue->SetBoolean(IsContainerNode());
 }
 
 void CXFA_Node::Script_NodeClass_IsNull(CFXJSE_Value* pValue,
                                         bool bSetting,
                                         XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    if (GetElementType() == XFA_Element::Subform) {
-      pValue->SetBoolean(false);
-      return;
-    }
-    CFX_WideString strValue;
-    pValue->SetBoolean(!TryContent(strValue) || strValue.IsEmpty());
+    ThrowInvalidPropertyException();
+    return;
   }
+  if (GetElementType() == XFA_Element::Subform) {
+    pValue->SetBoolean(false);
+    return;
+  }
+  CFX_WideString strValue;
+  pValue->SetBoolean(!TryContent(strValue) || strValue.IsEmpty());
 }
 
 void CXFA_Node::Script_NodeClass_OneOfChild(CFXJSE_Value* pValue,
                                             bool bSetting,
                                             XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CXFA_NodeArray properts;
-    int32_t iSize = GetNodeList(properts, XFA_NODEFILTER_OneOfProperty);
-    if (iSize > 0) {
-      pValue->Assign(
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(properts[0]));
-    }
+    ThrowInvalidPropertyException();
+    return;
+  }
+
+  CXFA_NodeArray properts;
+  int32_t iSize = GetNodeList(properts, XFA_NODEFILTER_OneOfProperty);
+  if (iSize > 0) {
+    pValue->Assign(
+        m_pDocument->GetScriptContext()->GetJSValueFromMap(properts[0]));
   }
 }
 
@@ -1577,7 +1583,7 @@
 void CXFA_Node::Script_ModelClass_IsCompatibleNS(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isCompatibleNS");
+    ThrowParamCountMismatchException(L"isCompatibleNS");
     return;
   }
   CFX_WideString wsNameSpace;
@@ -1613,11 +1619,11 @@
 void CXFA_Node::Script_Attribute_IntegerRead(CFXJSE_Value* pValue,
                                              bool bSetting,
                                              XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    pValue->SetInteger(GetInteger(eAttribute));
-  } else {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
   }
+  pValue->SetInteger(GetInteger(eAttribute));
 }
 
 void CXFA_Node::Script_Attribute_BOOL(CFXJSE_Value* pValue,
@@ -1633,11 +1639,11 @@
 void CXFA_Node::Script_Attribute_BOOLRead(CFXJSE_Value* pValue,
                                           bool bSetting,
                                           XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    pValue->SetString(GetBoolean(eAttribute) ? "1" : "0");
-  } else {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
   }
+  pValue->SetString(GetBoolean(eAttribute) ? "1" : "0");
 }
 
 void CXFA_Node::Script_Attribute_SendAttributeChangeMessage(
@@ -1863,31 +1869,29 @@
 void CXFA_Node::Script_Attribute_StringRead(CFXJSE_Value* pValue,
                                             bool bSetting,
                                             XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    CFX_WideString wsValue;
-    GetAttribute(eAttribute, wsValue);
-    pValue->SetString(
-        FX_UTF8Encode(wsValue.c_str(), wsValue.GetLength()).AsStringC());
-  } else {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
   }
+
+  CFX_WideString wsValue;
+  GetAttribute(eAttribute, wsValue);
+  pValue->SetString(
+      FX_UTF8Encode(wsValue.c_str(), wsValue.GetLength()).AsStringC());
 }
 
 void CXFA_Node::Script_WsdlConnection_Execute(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if ((argc == 0) || (argc == 1)) {
-    pArguments->GetReturnValue()->SetBoolean(false);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execute");
+  if (argc != 0 && argc != 1) {
+    ThrowParamCountMismatchException(L"execute");
+    return;
   }
+  pArguments->GetReturnValue()->SetBoolean(false);
 }
 
 void CXFA_Node::Script_Delta_Restore(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"restore");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"restore");
 }
 
 void CXFA_Node::Script_Delta_CurrentValue(CFXJSE_Value* pValue,
@@ -1965,15 +1969,16 @@
                                     bool bSetting,
                                     XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      pValue->SetInteger(0);
-      return;
-    }
-    pValue->SetInteger(pWidgetData->CountChoiceListItems(true));
+    ThrowInvalidPropertyException();
+    return;
   }
+
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    pValue->SetInteger(0);
+    return;
+  }
+  pValue->SetInteger(pWidgetData->CountChoiceListItems(true));
 }
 
 void CXFA_Node::Script_Som_DefaultValue(CFXJSE_Value* pValue,
@@ -2046,16 +2051,17 @@
                                              bool bSetting,
                                              XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+    ThrowInvalidPropertyException();
     return;
   }
+
   CFX_WideString content = GetScriptContent(true);
   if (content.IsEmpty()) {
     pValue->SetNull();
-  } else {
-    pValue->SetString(
-        FX_UTF8Encode(content.c_str(), content.GetLength()).AsStringC());
+    return;
   }
+  pValue->SetString(
+      FX_UTF8Encode(content.c_str(), content.GetLength()).AsStringC());
 }
 
 void CXFA_Node::Script_Boolean_Value(CFXJSE_Value* pValue,
@@ -2171,17 +2177,18 @@
 void CXFA_Node::Script_Som_DataNode(CFXJSE_Value* pValue,
                                     bool bSetting,
                                     XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    CXFA_Node* pDataNode = GetBindData();
-    if (pDataNode) {
-      pValue->Assign(
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(pDataNode));
-    } else {
-      pValue->SetNull();
-    }
-  } else {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
   }
+
+  CXFA_Node* pDataNode = GetBindData();
+  if (!pDataNode) {
+    pValue->SetNull();
+    return;
+  }
+
+  pValue->Assign(m_pDocument->GetScriptContext()->GetJSValueFromMap(pDataNode));
 }
 
 void CXFA_Node::Script_Draw_DefaultValue(CFXJSE_Value* pValue,
@@ -2376,10 +2383,10 @@
                                            bool bSetting,
                                            XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  } else {
-    pValue->SetNull();
+    ThrowInvalidPropertyException();
+    return;
   }
+  pValue->SetNull();
 }
 
 void CXFA_Node::Script_Field_SelectedIndex(CFXJSE_Value* pValue,
@@ -2410,38 +2417,39 @@
 }
 
 void CXFA_Node::Script_Field_ExecEvent(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString eventString = pArguments->GetUTF8String(0);
-    int32_t iRet = execSingleEventByName(
-        CFX_WideString::FromUTF8(eventString.AsStringC()).AsStringC(),
-        XFA_Element::Field);
-    if (eventString == "validate") {
-      pArguments->GetReturnValue()->SetBoolean(
-          (iRet == XFA_EVENTERROR_Error) ? false : true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"execEvent");
+    return;
   }
+
+  CFX_ByteString eventString = pArguments->GetUTF8String(0);
+  int32_t iRet = execSingleEventByName(
+      CFX_WideString::FromUTF8(eventString.AsStringC()).AsStringC(),
+      XFA_Element::Field);
+  if (eventString != "validate")
+    return;
+
+  pArguments->GetReturnValue()->SetBoolean(
+      (iRet == XFA_EVENTERROR_Error) ? false : true);
 }
 
 void CXFA_Node::Script_Field_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize, false, false);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execInitialize");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execInitialize");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize, false, false);
 }
 
 void CXFA_Node::Script_Field_DeleteItem(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"deleteItem");
+    ThrowParamCountMismatchException(L"deleteItem");
     return;
   }
   CXFA_WidgetData* pWidgetData = GetWidgetData();
@@ -2458,7 +2466,7 @@
 void CXFA_Node::Script_Field_GetSaveItem(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getSaveItem");
+    ThrowParamCountMismatchException(L"getSaveItem");
     return;
   }
   int32_t iIndex = pArguments->GetInt32(0);
@@ -2484,7 +2492,7 @@
 void CXFA_Node::Script_Field_BoundItem(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"boundItem");
+    ThrowParamCountMismatchException(L"boundItem");
     return;
   }
   CXFA_WidgetData* pWidgetData = GetWidgetData();
@@ -2503,7 +2511,7 @@
 void CXFA_Node::Script_Field_GetItemState(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getItemState");
+    ThrowParamCountMismatchException(L"getItemState");
     return;
   }
   CXFA_WidgetData* pWidgetData = GetWidgetData();
@@ -2518,16 +2526,16 @@
 }
 
 void CXFA_Node::Script_Field_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate, false, false);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execCalculate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execCalculate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate, false, false);
 }
 
 void CXFA_Node::Script_Field_SetItems(CFXJSE_Arguments* pArguments) {}
@@ -2535,7 +2543,7 @@
 void CXFA_Node::Script_Field_GetDisplayItem(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getDisplayItem");
+    ThrowParamCountMismatchException(L"getDisplayItem");
     return;
   }
   int32_t iIndex = pArguments->GetInt32(0);
@@ -2561,7 +2569,7 @@
 void CXFA_Node::Script_Field_SetItemState(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 2) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setItemState");
+    ThrowParamCountMismatchException(L"setItemState");
     return;
   }
   CXFA_WidgetData* pWidgetData = GetWidgetData();
@@ -2580,7 +2588,7 @@
 void CXFA_Node::Script_Field_AddItem(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 2) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addItem");
+    ThrowParamCountMismatchException(L"addItem");
     return;
   }
   CXFA_WidgetData* pWidgetData = GetWidgetData();
@@ -2601,29 +2609,28 @@
 }
 
 void CXFA_Node::Script_Field_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      pArguments->GetReturnValue()->SetBoolean(false);
-    } else {
-      int32_t iRet =
-          pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate, false, false);
-      pArguments->GetReturnValue()->SetBoolean(
-          (iRet == XFA_EVENTERROR_Error) ? false : true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execValidate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execValidate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify) {
+    pArguments->GetReturnValue()->SetBoolean(false);
+    return;
+  }
+
+  int32_t iRet =
+      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate, false, false);
+  pArguments->GetReturnValue()->SetBoolean(
+      (iRet == XFA_EVENTERROR_Error) ? false : true);
 }
 
 void CXFA_Node::Script_ExclGroup_ErrorText(CFXJSE_Value* pValue,
                                            bool bSetting,
                                            XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-  } else {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
-  }
+  if (bSetting)
+    ThrowInvalidPropertyException();
 }
 
 void CXFA_Node::Script_ExclGroup_DefaultAndRawValue(CFXJSE_Value* pValue,
@@ -2652,21 +2659,21 @@
                                            XFA_ATTRIBUTE eAttribute) {}
 
 void CXFA_Node::Script_ExclGroup_ExecEvent(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString eventString = pArguments->GetUTF8String(0);
-    execSingleEventByName(
-        CFX_WideString::FromUTF8(eventString.AsStringC()).AsStringC(),
-        XFA_Element::ExclGroup);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"execEvent");
+    return;
   }
+
+  CFX_ByteString eventString = pArguments->GetUTF8String(0);
+  execSingleEventByName(
+      CFX_WideString::FromUTF8(eventString.AsStringC()).AsStringC(),
+      XFA_Element::ExclGroup);
 }
 
 void CXFA_Node::Script_ExclGroup_SelectedMember(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
   if (argc < 0 || argc > 1) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"selectedMember");
+    ThrowParamCountMismatchException(L"selectedMember");
     return;
   }
 
@@ -2694,45 +2701,46 @@
 }
 
 void CXFA_Node::Script_ExclGroup_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execInitialize");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execInitialize");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
 }
 
 void CXFA_Node::Script_ExclGroup_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execCalculate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execCalculate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
 }
 
 void CXFA_Node::Script_ExclGroup_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      pArguments->GetReturnValue()->SetBoolean(false);
-    } else {
-      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
-      pArguments->GetReturnValue()->SetBoolean(
-          (iRet == XFA_EVENTERROR_Error) ? false : true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execValidate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execValidate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify) {
+    pArguments->GetReturnValue()->SetBoolean(false);
+    return;
+  }
+
+  int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
+  pArguments->GetReturnValue()->SetBoolean(
+      (iRet == XFA_EVENTERROR_Error) ? false : true);
 }
 
 void CXFA_Node::Script_Som_InstanceIndex(CFXJSE_Value* pValue,
@@ -2774,29 +2782,31 @@
 void CXFA_Node::Script_Subform_InstanceManager(CFXJSE_Value* pValue,
                                                bool bSetting,
                                                XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
-    CXFA_Node* pInstanceMgr = nullptr;
-    for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
-         pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
-      if (pNode->GetElementType() == XFA_Element::InstanceManager) {
-        CFX_WideStringC wsInstMgrName = pNode->GetCData(XFA_ATTRIBUTE_Name);
-        if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName.GetAt(0) == '_' &&
-            wsInstMgrName.Mid(1) == wsName) {
-          pInstanceMgr = pNode;
-        }
-        break;
-      }
-    }
-    if (pInstanceMgr) {
-      pValue->Assign(
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(pInstanceMgr));
-    } else {
-      pValue->SetNull();
-    }
-  } else {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
   }
+
+  CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
+  CXFA_Node* pInstanceMgr = nullptr;
+  for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
+       pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
+    if (pNode->GetElementType() == XFA_Element::InstanceManager) {
+      CFX_WideStringC wsInstMgrName = pNode->GetCData(XFA_ATTRIBUTE_Name);
+      if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName.GetAt(0) == '_' &&
+          wsInstMgrName.Mid(1) == wsName) {
+        pInstanceMgr = pNode;
+      }
+      break;
+    }
+  }
+  if (!pInstanceMgr) {
+    pValue->SetNull();
+    return;
+  }
+
+  pValue->Assign(
+      m_pDocument->GetScriptContext()->GetJSValueFromMap(pInstanceMgr));
 }
 
 void CXFA_Node::Script_Subform_Locale(CFXJSE_Value* pValue,
@@ -2814,65 +2824,63 @@
 }
 
 void CXFA_Node::Script_Subform_ExecEvent(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString eventString = pArguments->GetUTF8String(0);
-    execSingleEventByName(
-        CFX_WideString::FromUTF8(eventString.AsStringC()).AsStringC(),
-        XFA_Element::Subform);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execEvent");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"execEvent");
+    return;
   }
+
+  CFX_ByteString eventString = pArguments->GetUTF8String(0);
+  execSingleEventByName(
+      CFX_WideString::FromUTF8(eventString.AsStringC()).AsStringC(),
+      XFA_Element::Subform);
 }
 
 void CXFA_Node::Script_Subform_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execInitialize");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execInitialize");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
 }
 
 void CXFA_Node::Script_Subform_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execCalculate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execCalculate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
 }
 
 void CXFA_Node::Script_Subform_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      pArguments->GetReturnValue()->SetBoolean(false);
-    } else {
-      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
-      pArguments->GetReturnValue()->SetBoolean(
-          (iRet == XFA_EVENTERROR_Error) ? false : true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execValidate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execValidate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify) {
+    pArguments->GetReturnValue()->SetBoolean(false);
+    return;
+  }
+
+  int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
+  pArguments->GetReturnValue()->SetBoolean(
+      (iRet == XFA_EVENTERROR_Error) ? false : true);
 }
 
 void CXFA_Node::Script_Subform_GetInvalidObjects(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getInvalidObjects");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"getInvalidObjects");
 }
 
 int32_t CXFA_Node::Subform_and_SubformSet_InstanceIndex() {
@@ -2890,136 +2898,136 @@
 }
 
 void CXFA_Node::Script_Template_FormNodes(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    pArguments->GetReturnValue()->SetBoolean(true);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"formNodes");
+    return;
   }
+  pArguments->GetReturnValue()->SetBoolean(true);
 }
 
 void CXFA_Node::Script_Template_Remerge(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    m_pDocument->DoDataRemerge(true);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"remerge");
+    return;
   }
+  m_pDocument->DoDataRemerge(true);
 }
 
 void CXFA_Node::Script_Template_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      pArguments->GetReturnValue()->SetBoolean(false);
-    } else {
-      pArguments->GetReturnValue()->SetBoolean(true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execInitialize");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execInitialize");
+    return;
   }
+
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    pArguments->GetReturnValue()->SetBoolean(false);
+    return;
+  }
+  pArguments->GetReturnValue()->SetBoolean(true);
 }
 
 void CXFA_Node::Script_Template_CreateNode(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if ((argc > 0) && (argc < 4)) {
-    CFX_WideString strTagName;
-    CFX_WideString strName;
-    CFX_WideString strNameSpace;
-    CFX_ByteString bsTagName = pArguments->GetUTF8String(0);
-    strTagName = CFX_WideString::FromUTF8(bsTagName.AsStringC());
-    if (argc > 1) {
-      CFX_ByteString bsName = pArguments->GetUTF8String(1);
-      strName = CFX_WideString::FromUTF8(bsName.AsStringC());
-      if (argc == 3) {
-        CFX_ByteString bsNameSpace = pArguments->GetUTF8String(2);
-        strNameSpace = CFX_WideString::FromUTF8(bsNameSpace.AsStringC());
-      }
-    }
-    XFA_Element eType = XFA_GetElementTypeForName(strTagName.AsStringC());
-    CXFA_Node* pNewNode = CreateSamePacketNode(eType);
-    if (!pNewNode) {
-      pArguments->GetReturnValue()->SetNull();
-    } else {
-      if (!strName.IsEmpty()) {
-        if (GetAttributeOfElement(eType, XFA_ATTRIBUTE_Name,
-                                  XFA_XDPPACKET_UNKNOWN)) {
-          pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, strName.AsStringC(), true);
-          if (pNewNode->GetPacketID() == XFA_XDPPACKET_Datasets) {
-            pNewNode->CreateXMLMappingNode();
-          }
-          pArguments->GetReturnValue()->Assign(
-              m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
-        } else {
-          ThrowException(XFA_IDS_NOT_HAVE_PROPERTY, strTagName.c_str(),
-                         L"name");
-        }
-      } else {
-        pArguments->GetReturnValue()->Assign(
-            m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
-      }
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"createNode");
+  if (argc <= 0 || argc >= 4) {
+    ThrowParamCountMismatchException(L"createNode");
+    return;
   }
+
+  CFX_WideString strName;
+  CFX_WideString strNameSpace;
+  CFX_ByteString bsTagName = pArguments->GetUTF8String(0);
+  CFX_WideString strTagName = CFX_WideString::FromUTF8(bsTagName.AsStringC());
+  if (argc > 1) {
+    CFX_ByteString bsName = pArguments->GetUTF8String(1);
+    strName = CFX_WideString::FromUTF8(bsName.AsStringC());
+    if (argc == 3) {
+      CFX_ByteString bsNameSpace = pArguments->GetUTF8String(2);
+      strNameSpace = CFX_WideString::FromUTF8(bsNameSpace.AsStringC());
+    }
+  }
+
+  XFA_Element eType = XFA_GetElementTypeForName(strTagName.AsStringC());
+  CXFA_Node* pNewNode = CreateSamePacketNode(eType);
+  if (!pNewNode) {
+    pArguments->GetReturnValue()->SetNull();
+    return;
+  }
+
+  if (strName.IsEmpty()) {
+    pArguments->GetReturnValue()->Assign(
+        m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
+    return;
+  }
+
+  if (!GetAttributeOfElement(eType, XFA_ATTRIBUTE_Name,
+                             XFA_XDPPACKET_UNKNOWN)) {
+    ThrowMissingPropertyException(strTagName, L"name");
+    return;
+  }
+
+  pNewNode->SetAttribute(XFA_ATTRIBUTE_Name, strName.AsStringC(), true);
+  if (pNewNode->GetPacketID() == XFA_XDPPACKET_Datasets)
+    pNewNode->CreateXMLMappingNode();
+
+  pArguments->GetReturnValue()->Assign(
+      m_pDocument->GetScriptContext()->GetJSValueFromMap(pNewNode));
 }
 
 void CXFA_Node::Script_Template_Recalculate(CFXJSE_Arguments* pArguments) {
-  if (pArguments->GetLength() == 1) {
-    pArguments->GetReturnValue()->SetBoolean(true);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"recalculate");
+    return;
   }
+  pArguments->GetReturnValue()->SetBoolean(true);
 }
 
 void CXFA_Node::Script_Template_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      pArguments->GetReturnValue()->SetBoolean(false);
-    } else {
-      pArguments->GetReturnValue()->SetBoolean(true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execCalculate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execCalculate");
+    return;
   }
+
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    pArguments->GetReturnValue()->SetBoolean(false);
+    return;
+  }
+  pArguments->GetReturnValue()->SetBoolean(true);
 }
 
 void CXFA_Node::Script_Template_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      pArguments->GetReturnValue()->SetBoolean(false);
-    } else {
-      pArguments->GetReturnValue()->SetBoolean(true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execValidate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execValidate");
+    return;
   }
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    pArguments->GetReturnValue()->SetBoolean(false);
+    return;
+  }
+  pArguments->GetReturnValue()->SetBoolean(true);
 }
 
 void CXFA_Node::Script_Manifest_Evaluate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_WidgetData* pWidgetData = GetWidgetData();
-    if (!pWidgetData) {
-      pArguments->GetReturnValue()->SetBoolean(false);
-    } else {
-      pArguments->GetReturnValue()->SetBoolean(true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"evaluate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"evaluate");
+    return;
   }
+
+  CXFA_WidgetData* pWidgetData = GetWidgetData();
+  if (!pWidgetData) {
+    pArguments->GetReturnValue()->SetBoolean(false);
+    return;
+  }
+  pArguments->GetReturnValue()->SetBoolean(true);
 }
 
 void CXFA_Node::Script_InstanceManager_Max(CFXJSE_Value* pValue,
                                            bool bSetting,
                                            XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+    ThrowInvalidPropertyException();
     return;
   }
   CXFA_Occur nodeOccur(GetOccurNode());
@@ -3030,7 +3038,7 @@
                                            bool bSetting,
                                            XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+    ThrowInvalidPropertyException();
     return;
   }
   CXFA_Occur nodeOccur(GetOccurNode());
@@ -3050,8 +3058,7 @@
 
 void CXFA_Node::Script_InstanceManager_MoveInstance(
     CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc != 2) {
+  if (pArguments->GetLength() != 2) {
     pArguments->GetReturnValue()->SetUndefined();
     return;
   }
@@ -3075,21 +3082,20 @@
 
 void CXFA_Node::Script_InstanceManager_RemoveInstance(
     CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc != 1) {
+  if (pArguments->GetLength() != 1) {
     pArguments->GetReturnValue()->SetUndefined();
     return;
   }
   int32_t iIndex = pArguments->GetInt32(0);
   int32_t iCount = GetCount(this);
   if (iIndex < 0 || iIndex >= iCount) {
-    ThrowException(XFA_IDS_INDEX_OUT_OF_BOUNDS);
+    ThrowIndexOutOfBoundsException();
     return;
   }
   CXFA_Occur nodeOccur(GetOccurNode());
   int32_t iMin = nodeOccur.GetMin();
   if (iCount - 1 < iMin) {
-    ThrowException(XFA_IDS_VIOLATE_BOUNDARY, L"min");
+    ThrowTooManyOccurancesException(L"min");
     return;
   }
   CXFA_Node* pRemoveInstance = GetItem(this, iIndex);
@@ -3114,8 +3120,7 @@
 
 void CXFA_Node::Script_InstanceManager_SetInstances(
     CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc != 1) {
+  if (pArguments->GetLength() != 1) {
     pArguments->GetReturnValue()->SetUndefined();
     return;
   }
@@ -3126,8 +3131,8 @@
 void CXFA_Node::Script_InstanceManager_AddInstance(
     CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if ((argc != 0) && (argc != 1)) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addInstance");
+  if (argc != 0 && argc != 1) {
+    ThrowParamCountMismatchException(L"addInstance");
     return;
   }
   bool fFlags = true;
@@ -3138,7 +3143,7 @@
   CXFA_Occur nodeOccur(GetOccurNode());
   int32_t iMax = nodeOccur.GetMax();
   if (iMax >= 0 && iCount >= iMax) {
-    ThrowException(XFA_IDS_VIOLATE_BOUNDARY, L"max");
+    ThrowTooManyOccurancesException(L"max");
     return;
   }
   CXFA_Node* pNewInstance = CreateInstance(this, fFlags);
@@ -3161,8 +3166,8 @@
 void CXFA_Node::Script_InstanceManager_InsertInstance(
     CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if ((argc != 1) && (argc != 2)) {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"insertInstance");
+  if (argc != 1 && argc != 2) {
+    ThrowParamCountMismatchException(L"insertInstance");
     return;
   }
   int32_t iIndex = pArguments->GetInt32(0);
@@ -3173,12 +3178,12 @@
   CXFA_Occur nodeOccur(GetOccurNode());
   int32_t iCount = GetCount(this);
   if (iIndex < 0 || iIndex > iCount) {
-    ThrowException(XFA_IDS_INDEX_OUT_OF_BOUNDS);
+    ThrowIndexOutOfBoundsException();
     return;
   }
   int32_t iMax = nodeOccur.GetMax();
   if (iMax >= 0 && iCount >= iMax) {
-    ThrowException(XFA_IDS_VIOLATE_BOUNDARY, L"max");
+    ThrowTooManyOccurancesException(L"max");
     return;
   }
   CXFA_Node* pNewInstance = CreateInstance(this, bBind);
@@ -3203,11 +3208,11 @@
   int32_t iMax = nodeOccur.GetMax();
   int32_t iMin = nodeOccur.GetMin();
   if (iDesired < iMin) {
-    ThrowException(XFA_IDS_VIOLATE_BOUNDARY, L"min");
+    ThrowTooManyOccurancesException(L"min");
     return 1;
   }
   if ((iMax >= 0) && (iDesired > iMax)) {
-    ThrowException(XFA_IDS_VIOLATE_BOUNDARY, L"max");
+    ThrowTooManyOccurancesException(L"max");
     return 2;
   }
   int32_t iCount = GetCount(this);
@@ -3262,7 +3267,7 @@
 int32_t CXFA_Node::InstanceManager_MoveInstance(int32_t iTo, int32_t iFrom) {
   int32_t iCount = GetCount(this);
   if (iFrom > iCount || iTo > iCount - 1) {
-    ThrowException(XFA_IDS_INDEX_OUT_OF_BOUNDS);
+    ThrowIndexOutOfBoundsException();
     return 1;
   }
   if (iFrom < 0 || iTo < 0 || iFrom == iTo) {
@@ -3305,51 +3310,52 @@
 
 void CXFA_Node::Script_Desc_Metadata(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if ((argc == 0) || (argc == 1)) {
-    pArguments->GetReturnValue()->SetString("");
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"metadata");
+  if (argc != 0 && argc != 1) {
+    ThrowParamCountMismatchException(L"metadata");
+    return;
   }
+  pArguments->GetReturnValue()->SetString("");
 }
 
 void CXFA_Node::Script_Form_FormNodes(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CXFA_Node* pDataNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-    if (pDataNode) {
-      CXFA_NodeArray formItems;
-      CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
-      pFormNodes->SetArrayNodeList(formItems);
-      pArguments->GetReturnValue()->SetObject(
-          pFormNodes, m_pDocument->GetScriptContext()->GetJseNormalClass());
-    } else {
-      ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"formNodes");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"formNodes");
+    return;
   }
+
+  CXFA_Node* pDataNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  if (!pDataNode) {
+    ThrowArgumentMismatchException();
+    return;
+  }
+
+  CXFA_NodeArray formItems;
+  CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
+  pFormNodes->SetArrayNodeList(formItems);
+  pArguments->GetReturnValue()->SetObject(
+      pFormNodes, m_pDocument->GetScriptContext()->GetJseNormalClass());
 }
 
 void CXFA_Node::Script_Form_Remerge(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    m_pDocument->DoDataRemerge(true);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remerge");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"remerge");
+    return;
   }
+
+  m_pDocument->DoDataRemerge(true);
 }
 
 void CXFA_Node::Script_Form_ExecInitialize(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execInitialize");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execInitialize");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Initialize);
 }
 
 void CXFA_Node::Script_Form_Recalculate(CFXJSE_Arguments* pArguments) {
@@ -3359,51 +3365,50 @@
       pEventParam->m_eType == XFA_EVENT_InitCalculate) {
     return;
   }
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    const bool bScriptFlags = pArguments->GetInt32(0) != 0;
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    if (bScriptFlags) {
-      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
-      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
-      pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Ready, true);
-    } else {
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"recalculate");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"recalculate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+  if (pArguments->GetInt32(0) != 0)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Ready, true);
 }
 
 void CXFA_Node::Script_Form_ExecCalculate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      return;
-    }
-    pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execCalculate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execCalculate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify)
+    return;
+
+  pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Calculate);
 }
 
 void CXFA_Node::Script_Form_ExecValidate(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
-    if (!pNotify) {
-      pArguments->GetReturnValue()->SetBoolean(false);
-    } else {
-      int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
-      pArguments->GetReturnValue()->SetBoolean(
-          (iRet == XFA_EVENTERROR_Error) ? false : true);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"execValidate");
+  if (pArguments->GetLength() != 0) {
+    ThrowParamCountMismatchException(L"execValidate");
+    return;
   }
+
+  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
+  if (!pNotify) {
+    pArguments->GetReturnValue()->SetBoolean(false);
+    return;
+  }
+
+  int32_t iRet = pNotify->ExecEventByDeepFirst(this, XFA_EVENT_Validate);
+  pArguments->GetReturnValue()->SetBoolean(
+      (iRet == XFA_EVENTERROR_Error) ? false : true);
 }
 
 void CXFA_Node::Script_Form_Checksum(CFXJSE_Value* pValue,
@@ -3411,66 +3416,67 @@
                                      XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
     SetAttribute(XFA_ATTRIBUTE_Checksum, pValue->ToWideString().AsStringC());
-  } else {
-    CFX_WideString wsChecksum;
-    GetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum, false);
-    pValue->SetString(
-        FX_UTF8Encode(wsChecksum.c_str(), wsChecksum.GetLength()).AsStringC());
+    return;
   }
+
+  CFX_WideString wsChecksum;
+  GetAttribute(XFA_ATTRIBUTE_Checksum, wsChecksum, false);
+  pValue->SetString(
+      FX_UTF8Encode(wsChecksum.c_str(), wsChecksum.GetLength()).AsStringC());
 }
 
 void CXFA_Node::Script_Packet_GetAttribute(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString bsAttributeName = pArguments->GetUTF8String(0);
-    CFX_WideString wsAttributeValue;
-    CFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      static_cast<CFDE_XMLElement*>(pXMLNode)->GetString(
-          CFX_WideString::FromUTF8(bsAttributeName.AsStringC()).c_str(),
-          wsAttributeValue);
-    }
-    pArguments->GetReturnValue()->SetString(
-        FX_UTF8Encode(wsAttributeValue.c_str(), wsAttributeValue.GetLength())
-            .AsStringC());
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"getAttribute");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"getAttribute");
+    return;
   }
+
+  CFX_ByteString bsAttributeName = pArguments->GetUTF8String(0);
+  CFX_WideString wsAttributeValue;
+  CFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+  if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
+    static_cast<CFDE_XMLElement*>(pXMLNode)->GetString(
+        CFX_WideString::FromUTF8(bsAttributeName.AsStringC()).c_str(),
+        wsAttributeValue);
+  }
+  pArguments->GetReturnValue()->SetString(
+      FX_UTF8Encode(wsAttributeValue.c_str(), wsAttributeValue.GetLength())
+          .AsStringC());
 }
 
 void CXFA_Node::Script_Packet_SetAttribute(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 2) {
-    CFX_ByteString bsValue = pArguments->GetUTF8String(0);
-    CFX_ByteString bsName = pArguments->GetUTF8String(1);
-    CFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      static_cast<CFDE_XMLElement*>(pXMLNode)->SetString(
-          CFX_WideString::FromUTF8(bsName.AsStringC()),
-          CFX_WideString::FromUTF8(bsValue.AsStringC()));
-    }
-    pArguments->GetReturnValue()->SetNull();
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setAttribute");
+  if (pArguments->GetLength() != 2) {
+    ThrowParamCountMismatchException(L"setAttribute");
+    return;
   }
+
+  CFX_ByteString bsValue = pArguments->GetUTF8String(0);
+  CFX_ByteString bsName = pArguments->GetUTF8String(1);
+  CFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+  if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
+    static_cast<CFDE_XMLElement*>(pXMLNode)->SetString(
+        CFX_WideString::FromUTF8(bsName.AsStringC()),
+        CFX_WideString::FromUTF8(bsValue.AsStringC()));
+  }
+  pArguments->GetReturnValue()->SetNull();
 }
 
 void CXFA_Node::Script_Packet_RemoveAttribute(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString bsName = pArguments->GetUTF8String(0);
-    CFX_WideString wsName = CFX_WideString::FromUTF8(bsName.AsStringC());
-    CFDE_XMLNode* pXMLNode = GetXMLMappingNode();
-    if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
-      CFDE_XMLElement* pXMLElement = static_cast<CFDE_XMLElement*>(pXMLNode);
-      if (pXMLElement->HasAttribute(wsName.c_str())) {
-        pXMLElement->RemoveAttribute(wsName.c_str());
-      }
-    }
-    pArguments->GetReturnValue()->SetNull();
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"removeAttribute");
+  if (pArguments->GetLength() != 1) {
+    ThrowParamCountMismatchException(L"removeAttribute");
+    return;
   }
+
+  CFX_ByteString bsName = pArguments->GetUTF8String(0);
+  CFX_WideString wsName = CFX_WideString::FromUTF8(bsName.AsStringC());
+  CFDE_XMLNode* pXMLNode = GetXMLMappingNode();
+  if (pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element) {
+    CFDE_XMLElement* pXMLElement = static_cast<CFDE_XMLElement*>(pXMLNode);
+    if (pXMLElement->HasAttribute(wsName.c_str())) {
+      pXMLElement->RemoveAttribute(wsName.c_str());
+    }
+  }
+  pArguments->GetReturnValue()->SetNull();
 }
 
 void CXFA_Node::Script_Packet_Content(CFXJSE_Value* pValue,
@@ -3495,139 +3501,88 @@
 }
 
 void CXFA_Node::Script_Source_Next(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"next");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"next");
 }
 
 void CXFA_Node::Script_Source_CancelBatch(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancelBatch");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"cancelBatch");
 }
 
 void CXFA_Node::Script_Source_First(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"first");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"first");
 }
 
 void CXFA_Node::Script_Source_UpdateBatch(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"updateBatch");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"updateBatch");
 }
 
 void CXFA_Node::Script_Source_Previous(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"previous");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"previous");
 }
 
 void CXFA_Node::Script_Source_IsBOF(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isBOF");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"isBOF");
 }
 
 void CXFA_Node::Script_Source_IsEOF(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"isEOF");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"isEOF");
 }
 
 void CXFA_Node::Script_Source_Cancel(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"cancel");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"cancel");
 }
 
 void CXFA_Node::Script_Source_Update(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"update");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"update");
 }
 
 void CXFA_Node::Script_Source_Open(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"open");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"open");
 }
 
 void CXFA_Node::Script_Source_Delete(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"delete");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"delete");
 }
 
 void CXFA_Node::Script_Source_AddNew(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"addNew");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"addNew");
 }
 
 void CXFA_Node::Script_Source_Requery(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"requery");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"requery");
 }
 
 void CXFA_Node::Script_Source_Resync(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resync");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"resync");
 }
 
 void CXFA_Node::Script_Source_Close(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"close");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"close");
 }
 
 void CXFA_Node::Script_Source_Last(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"last");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"last");
 }
 
 void CXFA_Node::Script_Source_HasDataChanged(CFXJSE_Arguments* pArguments) {
-  int32_t argc = pArguments->GetLength();
-  if (argc == 0) {
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"hasDataChanged");
-  }
+  if (pArguments->GetLength() != 0)
+    ThrowParamCountMismatchException(L"hasDataChanged");
 }
 
 void CXFA_Node::Script_Source_Db(CFXJSE_Value* pValue,
@@ -3660,7 +3615,7 @@
                                         bool bSetting,
                                         XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+    ThrowInvalidPropertyException();
     return;
   }
   pValue->SetString(FX_UTF8Encode(FX_WSTRC(L"0")).AsStringC());
@@ -5194,3 +5149,17 @@
   }
   pSrcModule->MoveBufferMapData(pDstModule, pKey);
 }
+
+void CXFA_Node::ThrowMissingPropertyException(
+    const CFX_WideString& obj,
+    const CFX_WideString& prop) const {
+  ThrowException(L"'%s' doesn't have property '%s'.", obj.c_str(),
+                 prop.c_str());
+}
+
+void CXFA_Node::ThrowTooManyOccurancesException(
+    const CFX_WideString& obj) const {
+  ThrowException(
+      L"The element [%s] has violated its allowable number of occurrences.",
+      obj.c_str());
+}
diff --git a/xfa/fxfa/parser/cxfa_nodelist.cpp b/xfa/fxfa/parser/cxfa_nodelist.cpp
index cb09833..97c531f 100644
--- a/xfa/fxfa/parser/cxfa_nodelist.cpp
+++ b/xfa/fxfa/parser/cxfa_nodelist.cpp
@@ -36,85 +36,90 @@
 
 void CXFA_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-    if (pNode) {
-      Append(pNode);
-    } else {
-      ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"append");
+  if (argc != 1) {
+    ThrowParamCountMismatchException(L"append");
+    return;
   }
+
+  CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  if (!pNode) {
+    ThrowArgumentMismatchException();
+    return;
+  }
+  Append(pNode);
 }
 
 void CXFA_NodeList::Script_ListClass_Insert(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if (argc == 2) {
-    CXFA_Node* pNewNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-    CXFA_Node* pBeforeNode = static_cast<CXFA_Node*>(pArguments->GetObject(1));
-    if (pNewNode) {
-      Insert(pNewNode, pBeforeNode);
-    } else {
-      ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"insert");
+  if (argc != 2) {
+    ThrowParamCountMismatchException(L"insert");
+    return;
   }
+
+  CXFA_Node* pNewNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  CXFA_Node* pBeforeNode = static_cast<CXFA_Node*>(pArguments->GetObject(1));
+  if (!pNewNode) {
+    ThrowArgumentMismatchException();
+    return;
+  }
+  Insert(pNewNode, pBeforeNode);
 }
 
 void CXFA_NodeList::Script_ListClass_Remove(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-    if (pNode) {
-      Remove(pNode);
-    } else {
-      ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"remove");
+  if (argc != 1) {
+    ThrowParamCountMismatchException(L"remove");
+    return;
   }
+
+  CXFA_Node* pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  if (!pNode) {
+    ThrowArgumentMismatchException();
+    return;
+  }
+  Remove(pNode);
 }
 
 void CXFA_NodeList::Script_ListClass_Item(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    int32_t iIndex = pArguments->GetInt32(0);
-    if ((iIndex >= 0) && (iIndex + 1 <= GetLength())) {
-      pArguments->GetReturnValue()->Assign(
-          m_pDocument->GetScriptContext()->GetJSValueFromMap(Item(iIndex)));
-    } else {
-      ThrowException(XFA_IDS_INDEX_OUT_OF_BOUNDS);
-    }
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"item");
+  if (argc != 1) {
+    ThrowParamCountMismatchException(L"item");
+    return;
   }
+
+  int32_t iIndex = pArguments->GetInt32(0);
+  if (iIndex < 0 || iIndex >= GetLength()) {
+    ThrowIndexOutOfBoundsException();
+    return;
+  }
+  pArguments->GetReturnValue()->Assign(
+      m_pDocument->GetScriptContext()->GetJSValueFromMap(Item(iIndex)));
 }
 
 void CXFA_NodeList::Script_TreelistClass_NamedItem(
     CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
-  if (argc == 1) {
-    CFX_ByteString szName = pArguments->GetUTF8String(0);
-    CXFA_Node* pNode =
-        NamedItem(CFX_WideString::FromUTF8(szName.AsStringC()).AsStringC());
-    if (!pNode) {
-      return;
-    }
-    pArguments->GetReturnValue()->Assign(
-        m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
-  } else {
-    ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"namedItem");
+  if (argc != 1) {
+    ThrowParamCountMismatchException(L"namedItem");
+    return;
   }
+
+  CFX_ByteString szName = pArguments->GetUTF8String(0);
+  CXFA_Node* pNode =
+      NamedItem(CFX_WideString::FromUTF8(szName.AsStringC()).AsStringC());
+  if (!pNode)
+    return;
+
+  pArguments->GetReturnValue()->Assign(
+      m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
 }
 
 void CXFA_NodeList::Script_ListClass_Length(CFXJSE_Value* pValue,
                                             bool bSetting,
                                             XFA_ATTRIBUTE eAttribute) {
-  if (!bSetting) {
-    pValue->SetInteger(GetLength());
-  } else {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+  if (bSetting) {
+    ThrowInvalidPropertyException();
+    return;
   }
+  pValue->SetInteger(GetLength());
 }
diff --git a/xfa/fxfa/parser/cxfa_object.cpp b/xfa/fxfa/parser/cxfa_object.cpp
index c8ed713..45e3442 100644
--- a/xfa/fxfa/parser/cxfa_object.cpp
+++ b/xfa/fxfa/parser/cxfa_object.cpp
@@ -39,7 +39,7 @@
                                                bool bSetting,
                                                XFA_ATTRIBUTE eAttribute) {
   if (bSetting) {
-    ThrowException(XFA_IDS_INVAlID_PROP_SET);
+    ThrowInvalidPropertyException();
     return;
   }
   CFX_WideStringC className = GetClassName();
@@ -47,14 +47,29 @@
       FX_UTF8Encode(className.c_str(), className.GetLength()).AsStringC());
 }
 
-void CXFA_Object::ThrowException(int32_t iStringID, ...) {
-  IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
-  ASSERT(pAppProvider);
+void CXFA_Object::ThrowInvalidPropertyException() const {
+  ThrowException(L"Invalid property set operation.");
+}
 
+void CXFA_Object::ThrowIndexOutOfBoundsException() const {
+  ThrowException(L"Index value is out of bounds.");
+}
+
+void CXFA_Object::ThrowParamCountMismatchException(
+    const CFX_WideString& method) const {
+  ThrowException(L"Incorrect number of parameters calling method '%s'.",
+                 method.c_str());
+}
+
+void CXFA_Object::ThrowArgumentMismatchException() const {
+  ThrowException(L"Argument mismatch in property or function argument.");
+}
+
+void CXFA_Object::ThrowException(const FX_WCHAR* str, ...) const {
   CFX_WideString wsMessage;
   va_list arg_ptr;
-  va_start(arg_ptr, iStringID);
-  wsMessage.FormatV(pAppProvider->LoadString(iStringID).c_str(), arg_ptr);
+  va_start(arg_ptr, str);
+  wsMessage.FormatV(str, arg_ptr);
   va_end(arg_ptr);
   FXJSE_ThrowMessage(
       FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC());
diff --git a/xfa/fxfa/parser/xfa_object.h b/xfa/fxfa/parser/xfa_object.h
index c3686ac..93f4e01 100644
--- a/xfa/fxfa/parser/xfa_object.h
+++ b/xfa/fxfa/parser/xfa_object.h
@@ -90,9 +90,15 @@
   void Script_ObjectClass_ClassName(CFXJSE_Value* pValue,
                                     bool bSetting,
                                     XFA_ATTRIBUTE eAttribute);
-  void ThrowException(int32_t iStringID, ...);
+
+  void ThrowInvalidPropertyException() const;
+  void ThrowArgumentMismatchException() const;
+  void ThrowIndexOutOfBoundsException() const;
+  void ThrowParamCountMismatchException(const CFX_WideString& method) const;
 
  protected:
+  void ThrowException(const FX_WCHAR* str, ...) const;
+
   CXFA_Document* const m_pDocument;
   const XFA_ObjectType m_objectType;
   const XFA_Element m_elementType;
@@ -676,6 +682,11 @@
   uint32_t m_dwNameHash;
   CXFA_Node* m_pAuxNode;
   XFA_MAPMODULEDATA* m_pMapModuleData;
+
+ private:
+  void ThrowMissingPropertyException(const CFX_WideString& obj,
+                                     const CFX_WideString& prop) const;
+  void ThrowTooManyOccurancesException(const CFX_WideString& obj) const;
 };
 
 class CXFA_ThisProxy : public CXFA_Object {