Found one option!

ClassMethod DivideByZeroPython() [ Language = python ]

{

import sample

import iris

try:

print("divide by zero=" + str(sample.dividezero(1)))

except ZeroDivisionError as e:

errobj=iris.cls("%Exception.General")._New(str(e),42)

a=errobj.Log()

print("Caught exception: " + str(e))

}

This stores the error in Apps Log, but no stack (of course):

Any ideas how I can store at least the class and line of code in parameters? I can provide the name and location to %Exception.General class that will be stored in the App Log.

Yes. 

It maybe a different thing: the format with <Export generator> is outdated and Studio together with LoadDir both support the outdated format and don't support the "new" one without the <Export> element, which is in Atelier API that VSCode is using (why do we still use this Atelier name? )

So, I'd better ask to support the new format, as the Export tag thing also has an annoying "feature" that it incudes date/time of export and this changes the file with every save/export even there were no changes.

Sounds like that.

Actually, I tried with another proejct and failed going with PKG approach, as DFI are being exported in a shorter form for me, .e.g.:

<?xml version="1.0"?>

<dashboard xmlns="http://www.intersystems.com/deepsee/library" name="AnnualPotatos" folderName="" title="Annual Potato Analytics" description="" keywords="" owner="" shared="true" public="true" locked="false" resource="" timeCreated="2025-08-26T23:29:13.2Z" createdBy="SuperUser" category="" bookCover="" scheme="" worklistCount="2" snapTo="true" snapGrid="true" gridRows="10" gridCols="10" canResize="true" canModify="true" showTitleBar="true" titleBarOpacity="" titleBarColor="" selectedTitleBarOpacity="" selectedTitleBarColor="" titleBarTextColor="" selectedTitleBarTextColor="" titleBarFont="" companyName="" companyLogo="" companyStyle="" backgroundColor="white" backgroundImage="none" backgroundRepeat="no-repeat" backgroundSize="100% 100%" backgroundOpacity="1" widgetBorders="1px solid #F0F0F0" widgetBordersSwitch="edit" widgetBordersColor="#F0F0F0" widgetBordersStyle="solid" widgetBordersWidth="1" widgetBordersToggle="true">

<widget name="Widget2" type="pivot" subtype="comboChart" subtypeClass="comboChart" title="Potato Sales and Import, Tonnes" dataSource="Potatos/Yearly.pivot" dataLink="" drillDownDataSource="" width="200" height="200" sidebarContent="" showSidebar="false" sidebarWidth="" maximized="false" homeRowL="0" homeColL="0" colSpanL="7" rowSpanL="7" showToolbar="true" showToolbarBottomBorder="true" showToolbarOnlyWhenMaximized="false" colorToolbar="#F0F0F0" opacityToolbar="1" backgroundColor="#F0F0F0" opacity="1" theme="" dataColorList="">

<control name="" action="applyFilter" target="" targetProperty="[Country].[H1].[Country]" location="widget" type="auto" controlClass="" label="Country" title="" value="" text="" readOnly="false" valueList="" displayList="" activeWhen="">

<valueRequired>false</valueRequired>

</control>

<override name="comboChart">{legendVisible:'false',xAxis:{_type:'axis'},yAxisList:[{_type:'axis'}],seriesTypes:',bar',_type:'comboChart'}</override>

</widget>

</dashboard>

In your case there is also an export tag:

<?xml version="1.0"?>

<Export generator="IRIS" version="26" zv="IRIS for Windows (x86-64) 2024.3 (Build 217U)" ts="2025-09-21 16:49:04">



<dashboard xmlns="http://www.intersystems.com/deepsee/library" name="AnnualPotatos" folderName="Potatos" title="Annual Potato Analytics" description="" keywords="" owner="" shared="true" public="true" locked="false" resource="" timeCreated="2025-08-26T23:29:13.2Z" createdBy="SuperUser" category="" bookCover="" scheme="" worklistCount="2" snapTo="true" snapGrid="true" gridRows="10" gridCols="10" canResize="true" canModify="true" showTitleBar="true" titleBarOpacity="" titleBarColor="" selectedTitleBarOpacity="" selectedTitleBarColor="" titleBarTextColor="" selectedTitleBarTextColor="" titleBarFont="" companyName="" companyLogo="" companyStyle="" backgroundColor="white" backgroundImage="none" backgroundRepeat="no-repeat" backgroundSize="100% 100%" backgroundOpacity="1" widgetBorders="1px solid #F0F0F0" widgetBordersSwitch="edit" widgetBordersColor="#F0F0F0" widgetBordersStyle="solid" widgetBordersWidth="1" widgetBordersToggle="true">

<widget name="Widget2" type="pivot" subtype="comboChart" subtypeClass="comboChart" title="Potato Sales and Import, Tonnes" dataSource="Potatos/Yearly.pivot" dataLink="" drillDownDataSource="" width="200" height="200" sidebarContent="" showSidebar="false" sidebarWidth="" maximized="false" homeRowL="0" homeColL="0" colSpanL="7" rowSpanL="7" showToolbar="true" showToolbarBottomBorder="true" showToolbarOnlyWhenMaximized="false" colorToolbar="#F0F0F0" opacityToolbar="1" backgroundColor="#F0F0F0" opacity="1" theme="" dataColorList="">

<control name="" action="applyFilter" target="" targetProperty="[Country].[H1].[Country]" location="widget" type="auto" controlClass="" label="Country" title="" value="" text="" readOnly="false" valueList="" displayList="" activeWhen="">

<valueRequired>false</valueRequired>

</control>

<override name="comboChart">{legendVisible:'false',xAxis:{_type:'axis'},yAxisList:[{_type:'axis'}],seriesTypes:',bar',_type:'comboChart'}</override>

</widget>

</dashboard></Export>

And zpm load imports the latter one, but not the first type.

Also, if I save it in VSCode, it removes <export> tag as a result of compiling. But the same doesn't let it be imported via PKG approach.

Next is editing and control versioning in VS-Code.

DFI changes in VS-Code are not propagating to connected IRIS automatically after saving. @Brett Saviano  - any hints how can this be set up?

In order to make changes in the Dashboard portal to be automatically reflected, one can use git-source-control. After the following lines:

USER> zpm "install git-source-control" 

USER> do ##class(%Studio.SourceControl.Interface).SourceControlClassSet("SourceControl.Git.Extension")

changes made in Dashboard Portal editor are being exported into VSCode (into a file), but the location is wrong - git-source-control has created cls/ZXFree folder and dashboard.dfi

But I expected src/ZXfree.dashboard.DFI, as there is no Folder in a dashboard, just title="ZXFree"

@Pravin Barton , @Timothy Leavitt  - could you please take a look?

Like the minimalistic setup, but this doesn't work on mac:

 12/19/25-12:27:01:978 (467) 0 [Utility.Event] Initializing Interoperability during system startup
iris-1  | [INFO] ...started InterSystems IRIS instance IRIS
iris-1  | [INFO] Executing command /docker-entrypoint.sh iris-after-start '/ext/ascript.sh'...
iris-1  | [ERROR] /docker-entrypoint.sh: line 196: /ext/ascript.sh: Permission denied
iris-1  | [ERROR] Command "/docker-entrypoint.sh iris-after-start '/ext/ascript.sh'" exited with status 32256
iris-1  | [FATAL] Error executing post-startup command
iris-1  | [INFO] Shutting down InterSystems IRIS instance IRIS...

Hi @Brett Saviano !

I double checked the export format - the format is the same now and is supported both in IPM and VSCode ObjectScript.

The only issue left is file naming: Atelier REST API exports DFI file names with dFI extension as:

Potatos-AnnualPotatos.dashboard.DFI

at the same time IPM can consume DFI resources if they are presented as XML (tested in 0.10.4), e.g.:

Potatos/AnnualPotatos.dashboard.xml

Inviting @Pravin Barton also, maybe there are plans to do something with this in the future. 

And it exports files with "-" as a folder delimeter. Imagine if you have 100+pivots and dashboards in folders - in the code repository, they all will be in one folder with 100+ files with "-" as delimiters. Doesn't sound like a convenient approach. 

It's like ObjectScript code files will be named as:

/src/package-subpackage-class.cls

and all reside in one folder, instead of being distributed in packages as folders, as it is working now:

src/package/subpackage/class.cls

@Brett Saviano - hope we could fix this too in the future.